C# LinQ Any()是否强制转换集合中的所有项?
我知道当使用Linq的C# LinQ Any()是否强制转换集合中的所有项?,c#,.net,linq,C#,.net,Linq,我知道当使用Linq的Any()扩展来确定一个可枚举项是否至少有一个元素时,它将只使用一个元素。但这到底是怎么回事?它必须首先强制转换枚举中的所有项,还是一次只强制转换一个,从第一个开始,然后停止?Any()在IEnumerable上工作,因此不需要强制转换。它的实现非常简单,只需遍历可枚举项,查看是否可以找到任何符合指定条件的元素。简单实现如下所示: public bool Any<T>(IEnumerable<T> list) { using (var enu
Any()
扩展来确定一个可枚举项是否至少有一个元素时,它将只使用一个元素。但这到底是怎么回事?它必须首先强制转换枚举中的所有项,还是一次只强制转换一个,从第一个开始,然后停止?Any()
在IEnumerable
上工作,因此不需要强制转换。它的实现非常简单,只需遍历可枚举项,查看是否可以找到任何符合指定条件的元素。简单实现如下所示:
public bool Any<T>(IEnumerable<T> list)
{
using (var enumerator = list.GetEnumerator())
{
return enumerator.MoveNext();
}
}
public bool Any(IEnumerable列表)
{
使用(var enumerator=list.GetEnumerator())
{
返回枚举数.MoveNext();
}
}
因此,在public static类中不需要任何强制转换代码可枚举:
public static bool Any<TSource>(this IEnumerable<TSource> source) {
if(source==null) {
throw Error.ArgumentNull("source");
}
using(IEnumerator<TSource> enumerator=source.GetEnumerator()) {
if(enumerator.MoveNext()) {
return true;
}
}
return false;
}
public static bool Any<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) {
if(source==null) {
throw Error.ArgumentNull("source");
}
if(predicate==null) {
throw Error.ArgumentNull("predicate");
}
foreach(TSource local in source) {
if(predicate(local)) {
return true;
}
}
return false;
}
公共静态bool Any(此IEnumerable源代码){
if(source==null){
抛出错误。ArgumentNull(“源”);
}
使用(IEnumerator enumerator=source.GetEnumerator()){
if(枚举数.MoveNext()){
返回true;
}
}
返回false;
}
公共静态bool Any(此IEnumerable源,Func谓词){
if(source==null){
抛出错误。ArgumentNull(“源”);
}
if(谓词==null){
抛出错误。ArgumentNull(“谓词”);
}
foreach(源中的TSource本地){
if(谓词(局部)){
返回true;
}
}
返回false;
}
没有看到铸造,但通用 你为什么会怀疑这其中涉及到了演员阵容呢?我怀疑你使用的“演员阵容”的意思与普遍接受的含义不同。你认为这意味着什么?这是对于接受函数的重载,另一个无参数重载,在共享一个名称时,其行为完全不同。是的。并非所有版本都采用谓词。但总体思路是相同的:是否有任何元素(可选)符合给定的标准?在这两种情况下,都不需要对数据进行转换。不带谓词的版本基本上是
Any(x=>true)
的填充。LINQ版本是泛型的,您需要处理枚举数,您不需要空检查输入序列,但除此之外,它在道德上是相同的。@Servy:谢谢,我知道,简化它以便于理解空检查和泛型并没有那么重要,但处理枚举数确实很重要,不应该被忽略。