在List上运行时,.All()和.TrueForAll()之间有什么实际区别吗?我知道.All()是IEnumerable的一部分,那么为什么要添加.TrueForAll()呢?
List
.All()
.TrueForAll()
IEnumerable
uwopmtnx1#
关于docs for List<T>.TrueForAll:支持版本:4、3.5、3.0、2.0所以它被加在 * Enumerable.All之前。其他一些List<T>方法也是如此,它们的工作方式与LINQ方法类似。请注意,ConvertAll有些不同,因为它的优点是 * 知道 * 它正在处理List<T>并创建List<TResult>,因此它可以预先分配它需要的任何东西。
List<T>.TrueForAll
Enumerable.All
List<T>
ConvertAll
List<TResult>
bgibtngc2#
TrueForAll存在于.NET 2.0中,在LINQ出现在.NET 3.5之前。参见:http://msdn.microsoft.com/en-us/library/kdxe4x4w(v=VS.80).aspx
TrueForAll
e0bqpujr3#
很抱歉把这个挖出来,但我遇到了这个问题,并看到关于差异的实际问题没有得到适当的回答。区别在于:
IEnumerable.All()
List.TrueForAll()
foreach
MoveNext()
for
ubbxdtey4#
TrueForAll似乎是特定于List的,而All是LINQ的一部分。我的猜测是,前者可以追溯到.NET 2天,而后者是.NET 3.5中的新功能。
All
wydwbb8l5#
基本上,因为这种方法在Linq之前就存在了。TrueForAll在List上起源于Framework 2.0。
Linq
Framework 2.0
ctrmrzij6#
TrueForAll不是一个扩展方法,并且在版本2的框架中。
6条答案
按热度按时间uwopmtnx1#
关于docs for
List<T>.TrueForAll
:支持版本:4、3.5、3.0、2.0
所以它被加在 *
Enumerable.All
之前。其他一些
List<T>
方法也是如此,它们的工作方式与LINQ方法类似。请注意,ConvertAll
有些不同,因为它的优点是 * 知道 * 它正在处理List<T>
并创建List<TResult>
,因此它可以预先分配它需要的任何东西。bgibtngc2#
TrueForAll
存在于.NET 2.0中,在LINQ出现在.NET 3.5之前。参见:http://msdn.microsoft.com/en-us/library/kdxe4x4w(v=VS.80).aspx
e0bqpujr3#
很抱歉把这个挖出来,但我遇到了这个问题,并看到关于差异的实际问题没有得到适当的回答。
区别在于:
IEnumerable.All()
扩展方法对扩展对象进行额外的检查(如果它为null,则抛出异常)。IEnumerable.All()
可能不会按顺序检查元素。理论上,规范允许每次调用时以不同的顺序检查元素。List.TrueForAll()
在the documentation中指定它将始终按照列表的顺序。第二点是因为
Enumerable.All
必须使用foreach
或MoveNext()
方法来遍历项,而List.TrueForAll()
内部使用带有列表索引的for
循环。但是,您也可以非常确定
foreach
/MoveNext()
方法将按照列表条目的顺序返回元素,因为许多程序都期望这样,如果将来更改,则会中断。从性能的Angular 来看,
List.TrueForAll()
应该更快,因为它少了一个检查,而列表上的for
比foreach
便宜。然而,编译器通常做得很好,优化了很多,所以最终可能(几乎)没有可测量的差异。结论:
List.TrueForAll()
在理论上是较好的选择,但实际上没有区别。ubbxdtey4#
TrueForAll
似乎是特定于List的,而All
是LINQ的一部分。我的猜测是,前者可以追溯到.NET 2天,而后者是.NET 3.5中的新功能。
wydwbb8l5#
基本上,因为这种方法在
Linq
之前就存在了。TrueForAll
在List
上起源于Framework 2.0
。ctrmrzij6#
TrueForAll
不是一个扩展方法,并且在版本2的框架中。