linq List.All()和List.TrueForAll()的区别

p4rjhz4m  于 2023-11-14  发布在  其他
关注(0)|答案(6)|浏览(216)

List上运行时,.All().TrueForAll()之间有什么实际区别吗?我知道.All()IEnumerable的一部分,那么为什么要添加.TrueForAll()呢?

uwopmtnx

uwopmtnx1#

关于docs for List<T>.TrueForAll
支持版本:4、3.5、3.0、2.0
所以它被加在 * Enumerable.All之前。
其他一些List<T>方法也是如此,它们的工作方式与LINQ方法类似。请注意,ConvertAll有些不同,因为它的优点是 * 知道 * 它正在处理List<T>并创建List<TResult>,因此它可以预先分配它需要的任何东西。

bgibtngc

bgibtngc2#

TrueForAll存在于.NET 2.0中,在LINQ出现在.NET 3.5之前。
参见:http://msdn.microsoft.com/en-us/library/kdxe4x4w(v=VS.80).aspx

e0bqpujr

e0bqpujr3#

很抱歉把这个挖出来,但我遇到了这个问题,并看到关于差异的实际问题没有得到适当的回答。
区别在于:

  1. IEnumerable.All()扩展方法对扩展对象进行额外的检查(如果它为null,则抛出异常)。
  2. IEnumerable.All()可能不会按顺序检查元素。理论上,规范允许每次调用时以不同的顺序检查元素。List.TrueForAll()the documentation中指定它将始终按照列表的顺序。
    第二点是因为Enumerable.All必须使用foreachMoveNext()方法来遍历项,而List.TrueForAll()内部使用带有列表索引的for循环。
    但是,您也可以非常确定foreach/MoveNext()方法将按照列表条目的顺序返回元素,因为许多程序都期望这样,如果将来更改,则会中断。
    从性能的Angular 来看,List.TrueForAll()应该更快,因为它少了一个检查,而列表上的forforeach便宜。然而,编译器通常做得很好,优化了很多,所以最终可能(几乎)没有可测量的差异。
    结论:List.TrueForAll()在理论上是较好的选择,但实际上没有区别。
ubbxdtey

ubbxdtey4#

TrueForAll似乎是特定于List的,而All是LINQ的一部分。
我的猜测是,前者可以追溯到.NET 2天,而后者是.NET 3.5中的新功能。

wydwbb8l

wydwbb8l5#

基本上,因为这种方法在Linq之前就存在了。TrueForAllList上起源于Framework 2.0

ctrmrzij

ctrmrzij6#

TrueForAll不是一个扩展方法,并且在版本2的框架中。

相关问题