2009-08-26 64 views

回答

49

联盟删除重复。 Concat没有。

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

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

但是,如果有很多重复项,并且您不需要它们,则Union中用于移除重复项的额外处理可能会因代码中节省的消耗结果而抵消。

9

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

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

+0

就我而言,我最终会使用Distinct(),这有利于我使用Union。 – 2009-08-26 21:54:54

+6

如果你使用联盟,那么无论如何你都不需要调用Distinct。 – 2009-08-26 21:57:51

+2

联合会删除列表之间的重复项,但如果第一个列表中有重复项,则这些重复项不会被联合删除。所以 - 根据具体情况,可能仍然需要调用。 – 2009-08-27 12:24:02

3

以上说的是正确的。 这里只是一个小除了一些特殊情况

如果你有,如果你需要全速来连接例如两个列表和,考虑使用产量。当然这比UnionConcat Linq中的灵活性和舒适性要低得多。因此在特殊情况下才有意义。

此属性,例如将提供相同List1.Concat(列表2)

public IEnumerable<MyObject> AllObjects 
    { 
     get 
     { 
      foreach (MyObject o1 in List1) 
       yield return o1; 

      foreach (MyObject o2 in List2) 
       yield return o2; 
     } 
    } 
+0

'Concat'完全按照您在示例中显示的方式进行操作(请参阅:[source](https://referencesource.microsoft.com/#System.Core/System/Linq/ Enumerable.cs#800))。所以没有必要由你自己来实现它。 – scher 2017-11-08 10:21:06