【发布时间】:2020-05-18 21:44:43
【问题描述】:
【问题讨论】:
-
尝试两种方式。拿出秒表。那你就知道了。基于猜测的性能“分析”,无论受过多少教育,实际上都不能作为做出工程决策的基础。
【问题讨论】:
Union 删除重复项。 Concat 没有。
因此,如果来源包含任何共同的项目,或者有任何内部重复,它们会产生不同的结果。
如果您可以保证没有重复项,或者如果很少有重复项并且您不关心在输出中包含它们,Concat 会更快,因为无需针对已经产生的值测试每个值.
但是,如果有很多重复项并且您不需要它们,Union 中用于删除重复项的额外处理可能会被消耗结果的代码中的节省所抵消。
【讨论】:
您只关心执行速度吗?您收到一个元素需要多长时间来处理它?
Concat 更简单——它不需要自己执行任何处理,也不需要缓冲它已经返回的结果。但是,如果交集中有任何元素,它将产生更多的结果。如果您要花很长时间来处理每个结果,Concat 最终可能会实际上变慢。
【讨论】:
Union 将删除重复,即使它们仅在两个列表之一中重复。
上面说的是对的。 这里只是针对一些特殊情况的一点补充:
如果您必须连接例如两个列表并且如果您需要全速,请考虑使用yield。当然,这比 Linq 中的 Union 或 Concat 更不灵活和舒适。因此它只在特殊情况下才有意义。
例如,此属性将提供与 List1.Concat(List2) 相同的值
public IEnumerable<MyObject> AllObjects
{
get
{
foreach (MyObject o1 in List1)
yield return o1;
foreach (MyObject o2 in List2)
yield return o2;
}
}
【讨论】:
Concat 完全按照您在示例中显示的方式进行(参见:source)。所以没必要自己实现。