Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LinQ Any()是否强制转换集合中的所有项?_C#_.net_Linq - Fatal编程技术网

C# LinQ Any()是否强制转换集合中的所有项?

C# LinQ Any()是否强制转换集合中的所有项?,c#,.net,linq,C#,.net,Linq,我知道当使用Linq的Any()扩展来确定一个可枚举项是否至少有一个元素时,它将只使用一个元素。但这到底是怎么回事?它必须首先强制转换枚举中的所有项,还是一次只强制转换一个,从第一个开始,然后停止?Any()在IEnumerable上工作,因此不需要强制转换。它的实现非常简单,只需遍历可枚举项,查看是否可以找到任何符合指定条件的元素。简单实现如下所示: public bool Any<T>(IEnumerable<T> list) { using (var enu

我知道当使用Linq的
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:谢谢,我知道,简化它以便于理解空检查和泛型并没有那么重要,但处理枚举数确实很重要,不应该被忽略。