List.All()和List.TrueForAll()之间的区别

Bob*_*son 35 c# linq

在操作.All().TrueForAll()操作之间是否存在实际差异List?我知道这.All()是其中的一部分IEnumerable,为什么要添加.TrueForAll()

Jon*_*eet 47

来自以下文档List<T>.TrueForAll:

支持:4,3.5,3.0,2.0

所以之前 添加了它Enumerable.All.

对于一系列List<T>与LINQ对应方类似的其他方法也是如此.请注意,这ConvertAll有点不同,因为它具有知道它正在工作List<T>并创建一个的优点List<TResult>,因此它可以预先分配它需要的任何东西.

  • @Bobson:这是特定于实现的,但我会惊讶地看到任何显着差异。 (2认同)

小智 13

很抱歉挖出这个问题,但我遇到了这个问题,并且发现有关差异的实际问题没有得到正确的回答。

差异是:

  1. 扩展IEnumerable.All()方法对扩展对象进行额外的检查(如果它为空,则会抛出异常)。
  2. IEnumerable.All()可能不会按顺序检查元素。理论上,规范允许每次调用时以不同的顺序检查项目。在文档List.TrueForAll()中指定它将始终按列表的顺序排列。

第二点是因为Enumerable.All必须使用 aforeach或 theMoveNext()方法来迭代项目,而List.TrueForAll()内部使用for带有列表索引的循环。

但是,您也可以非常确定foreach/MoveNext()方法将按照列表条目的顺序返回元素,因为许多程序都希望这样做,并且如果将来更改它,就会中断。

从性能的角度来看,List.TrueForAll()应该更快,因为它少了一次检查,并且for在列表上比foreach. 然而,编译器通常做得很好,并在这里进行了很多优化,因此最终可能(几乎)没有可测量的差异。

结论:理论上List.TrueForAll()是更好的选择。但实际上,这没有什么区别。


Dan*_*ite 9

TrueForAll 在LINQ用于.NET 3.5之前,存在于.NET 2.0中.

请参阅:http://msdn.microsoft.com/en-us/library/kdxe4x4w(v = VS.80).aspx


Eti*_*tel 5

TrueForAll似乎特定于 List,而它All是 LINQ 的一部分。

我的猜测是前者可以追溯到 .NET 2 天,而后者是 .NET 3.5 中的新内容。