NET问答: Find() 和 Where().FirstOrDefault() 该如何选择 ?
咨询区
KingOfHypocrites:
我经常看到别人用 Where.FirstOrDefault()
获取某一个匹配集合的第一个元素,我在想为什么他们不使用 Find()
呢 ? 是不是前者更高级一点?有人能告诉我它们的差别吗?
比如下面的代码:
namespace LinqFindVsWhere
{class Program{static void Main(string[] args){List<string> list = new List<string>();list.AddRange(new string[]{"item1","item2","item3","item4"});string item2 = list.Find(x => x == "item2");Console.WriteLine(item2 == null ? "not found" : "found");string item3 = list.Where(x => x == "item3").FirstOrDefault();Console.WriteLine(item3 == null ? "not found" : "found");Console.ReadKey();}}
}
回答区
Abhinav Galodha:
在 IEnumerable<T>
上你能找到 Find
吗?
Where
和 FirstOrDefault
可用在多种序列集合上,包括:List<T>, T[], Collection<T>
等等,任何实现了 IEnumerable<T>
的集合都可以使用这两个方法。
Find
仅仅是在 List<T>
上可用。
M Muneeb Ijaz:
它们两者的区别在于,Where()
方法会遍历所有的记录然后再返回结果,而 Find()
方法则不会遍历所有记录,它只需遇到指定的 predicate
满足后即可返回。
我用 List<Test>
来做一个演示。
class Program{static void Main(string[] args){List<Test> tests = new List<Test>();tests.Add(new Test() { Id = 1, Name = "name1" });tests.Add(new Test() { Id = 2, Name = "name2" });tests.Add(new Test() { Id = 3, Name = "name3" });tests.Add(new Test() { Id = 4, Name = "name2" });var r = tests.Find(p => p.Name == "name2");Console.WriteLine(r.Id);}}class Test{public int Id { get; set; }public string Name { get; set; }}
为了能找到图中的 2
,Find 方法只需访问两次记录即可, 而 Where().FirstOrDefault()
则需访问 4
次,也就是全盘遍历。
点评区
汇总两位大佬的答案就是:易用
和 性能
绝对是成反比的,比如你知道的 ADO.NET
和 EntityFramework
, 又或者是 汇编
和 C#
...
其次要想深究,我觉得可以多用用 ILSpy
去挖挖源码。
// System.Collections.Generic.List<T>
public T Find(Predicate<T> match)
{if (match == null){ThrowHelper.ThrowArgumentNullException(ExceptionArgument.match);}for (int i = 0; i < _size; i++){if (match(_items[i])){return _items[i];}}return default(T);
}// System.Linq.Enumerable
public static TSource FirstOrDefault<TSource>(this IEnumerable<TSource> source)
{if (source == null){throw Error.ArgumentNull("source");}IList<TSource> list = source as IList<TSource>;if (list != null){if (list.Count > 0){return list[0];}}else{using (IEnumerator<TSource> enumerator = source.GetEnumerator()){if (enumerator.MoveNext()){return enumerator.Current;}}}return default(TSource);
}
NET问答: Find() 和 Where().FirstOrDefault() 该如何选择 ?相关推荐
- DPR:一种开放式问答(QA)模型
1 简介 DPR:Dense Passage Retrieval,密集文本段检索. 本文根据<Dense Passage Retrieval for Open-Domain Question A ...
- SpanBERT:提出基于分词的预训练模型,多项任务性能超越现有模型!
作者 | Mandar Joshi, Danqi Chen, Yinhan Liu, Daniel S. Weld, Luke Zettlemoyer, Omer Levy 译者 | Rachel 责 ...
- 结营答辩!28天!Datawhale助力公益AI一起学,点亮最暖寒假!
创新公益 28天前,为抵抗疫情,高校学子纷纷驻守在家,不能返校.不能去图书馆.在家如何高效学习,应对科研升学.求职就业的挑战? 我们觉得,大家需要一门好课,也需要好的学习氛围,更需要从学习到实践到就业 ...
- 你负责人工智能哪部分?人工那部分:知识图谱的构建主要靠人工还是机器?...
来源:学术头条 本文共4400字,建议阅读10+分钟. "论道知识图谱:知识赋能智能与智能产生知识" 大家都知道当前知识图谱是在当前人工智能领域一个备受关注的分支中有一个分类叫做& ...
- 如何0代码、快速定制企业级NLP模型?百度工程师详解技术选型与模型调优策略...
主讲人 | 龙心尘 百度NLP资深研发工程师 量子位编辑 | 公众号 QbitAI 近几年以预训练为代表的NLP技术取得了爆发式发展,新技术新模型层出不穷.企业与开发者如何将最先进的NLP领域科研成果 ...
- 10人以下小团队管理手册-学习笔记
[README] 本文总结于<10人以下小团队管理手册>,很nice的一本书,有兴趣的同学可以翻下: [0]序章 作者作为咨询师发现, 1.下属对主管有不满,主管对下属有怨言: 2.10人 ...
- 面向智能化软件开发的开源生态大数据
点击上方蓝字关注我们 面向智能化软件开发的开源生态大数据 张洋1, 王涛1, 尹刚2,3, 余跃1, 黄井泉3 1 国防科技大学计算机学院,湖南 长沙 410073 2 绿色计算产业联盟,北京 100 ...
- 疯狂的Web应用开源项目
2011-08-11 09:25 | 7235次阅读 | 来源:酷壳网 [已有7条评论]发表评论 关键词:开源项目,Web | 作者:陈皓 | 收藏这篇资讯 下面是一个Web应用的开源列表.没什么可说 ...
- 开源论坛之discourse搭建
快2个月没写博客,最近一个是忙着开发docker平台,另外一个是接手了公司私有云,所以比较忙. 公司最近有个新项目,想弄个技术的问答论坛,挑选了半天,选择ruby语言的discourse,这个是完全开 ...
最新文章
- event对象(触发机制)
- 【转】在 Linux 平台下使用 JNI
- bos 获取数据库连接_java解析数据接口获取json对象
- 每天一道LeetCode-----找到给定序列中所有和为某个值的集合或集合个数,序列中可以有/无重复项,集合元素顺序不同算不同集合等
- 挺个性的jQuery返回底部、返回顶部特效
- docker删除none镜像_Docker容器相关命令
- ThreadLocal父子线程传递实现方案
- Fov手术会不会在手术中新增手术边界
- 台式计算机年限怎么看,电脑使用年限_电脑使用年限查询
- AtCoder Beginner Contest 185
- [自测]linux运维100题目(阿里巴巴内部题目)
- 项目管理:项目进度优化策略
- 校园门禁app开发的功能
- 量子计算机技术难,量子计算机是什么工作原理运行的?现在制造还存在什么技术上的难...
- Springboot整合Shiro之授权
- 解决问题(七)——jsf+spring+hibernate整合(一)
- 事务四大特性(ACID)原子性、一致性、隔离性、持久性
- 辰光融信全面推出基于可信计算3.0技术的安全增强型打印机
- 山沟沟里的实业路(4)
- STM32智能小车------PWM驱动直流电机