LINQ语句之间的区别

 zhengfke 发布于 2023-02-12 18:13

有什么区别

FirstOrDefault(someField => someField.Name.Equals(settings.Text))

Where(someField => someField.Name.Equals(settings.Text)).FirstOrDefault() 

据我所知,在这两种情况下,Linq将一直运行到第一次出现这种情况.

2 个回答
  • 他们两个陈述的结果是一样的.您可以将第一个视为第二个的较短版本.

    FirstOrDefault方法有一个带有第二个参数的重载,Func<TSource, bool>它与您在Where语句中定义的谓词相同.

    2023-02-12 18:16 回答
  • 如果我们谈论Linq to Objects,那么有一个显着的区别.第二个声明

    Where(someField => someField.Name.Equals(settings.Text)).FirstOrDefault() 
    

    将在WhereEnumerableIterator内部创建,然后它将开始枚举并获取第一项:

    // argument checks and collection optimizations removed
    public static IEnumerable<TSource> Where<TSource>(
         this IEnumerable<TSource> source, Func<TSource, bool> predicate)
    {
         // it enumerates source and returns items which match predicate
         return new WhereEnumerableIterator<TSource>(source, predicate);
    }
    
    public static TSource First<TSource>(this IEnumerable<TSource> source)
    {
        using (IEnumerator<TSource> enumerator = source.GetEnumerator())
        {
            if (enumerator.MoveNext())        
                return enumerator.Current;        
        }
    
        throw Error.NoElements();
    }
    

    但是第一个语句将从源代码中获取与谓词匹配的第一个项目,而不创建额外的枚举器:

    // argument checks removed
    public static TSource First<TSource>(
        this IEnumerable<TSource> source, Func<TSource, bool> predicate)
    {    
        foreach (TSource local in source)
        {
            if (predicate(local))        
                return local;        
        }
    
        throw Error.NoMatch();
    }
    

    所以,第一个在性能方面更好:

    FirstOrDefault(someField => someField.Name.Equals(settings.Text))
    

    2023-02-12 18:16 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有