20

哪个更快:UnionConcat

我不在乎元素的顺序。

Enumerable.Union 方法

Enumerable.Concat 方法

4

3 回答 3

54

Union删除重复项。Concat才不是。

因此,如果源包含任何共同的项目或具有任何内部重复项,它们会产生不同的结果。

如果您可以保证没有重复项,或者如果很少,并且您不关心将它们包含在输出中,Concat则会更快,因为无需针对已经产生的值测试每个值。

但是,如果有许多重复项并且您不需要它们,则删除重复项的额外处理Union可能会被消耗结果的代码中的节省所抵消。

于 2009-08-26T21:50:35.713 回答
10

你只关心执行速度吗?当您收到一个元素时,您需要多长时间来处理它?

Concat更简单——它不需要自己执行任何处理,或者缓冲它已经返回的结果。但是,如果交集中有任何元素,它将产生更多的结果。如果您要花很长时间来处理每个结果,Concat最终可能会变得更慢。

于 2009-08-26T21:51:31.080 回答
3

上面说的是对的。这里只是一些特殊情况的一点补充

如果您必须连接例如两个列表并且如果您需要全速,请考虑使用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;
    }
}
于 2014-07-21T09:53:01.667 回答