关闭

C# Find vs FirstOrDefault

标签: C#linq
1187人阅读 评论(0) 收藏 举报
分类:

本文告诉大家,在获得数组第一个元素时,使用哪个方法性能更高。

需要知道,两个方法都是 Linq 的方法,使用之前需要引用 Linq 。对于 List 等都是继承可枚举Enumerable这时获取第一个元素可以使用FirstOrDefault。如果使用Find那么需要数组的类型是IList

下面写一个简单的例子

反编译 Find 可以看到下面代码,下面的代码删了一些代码,让大家比较容易看到 Find 使用的是 for 然后使用判断

private T[] _items;

public T Find(Predicate<T> match)
{

  for (int index = 0; index < this._size; ++index)
  {
    if (match(this._items[index]))
      return this._items[index];
  }
  return default (T);
}

而 FirstOrDefault 的代码存在 foreach ,这会调用列表的 GetEnumerator 方法,而且还会在结束的时候调用 Dispose 。这样 FirstOrDefault 的性能就比 Find 稍微差一些。

public static TSource FirstOrDefault<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
  foreach (TSource source1 in source)
  {
    if (predicate(source1))
      return source1;
  }
  return default (TSource);
}

所以在对于 List 类型的获得第一个或默认请使用 Find ,其他的请使用FirstOrDefault

  • 对于 List ,使用 for 的速度是 foreach 的两倍

  • 遍历 array 的速度是遍历 List 的两倍

  • 使用 for 遍历 array 的速度是使用 foreach 遍历 List 的5倍

参见:https://stackoverflow.com/a/365658/6116637

本文会经常更新,请阅读原文: https://lindexi.gitee.io/lindexi/post/C-Find-vs-FirstOrDefault.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

C# Linq First 和 FirstOrDefault的区别

 Enumerable.First 方法 返回序列中的第一个元素。 Enumerable.FirstOrDefault 方法 返回序列中的第一个元素;如果序列中不包含任何元...
  • stuwangjianglin
  • stuwangjianglin
  • 2014-06-23 13:04
  • 6245

C#中基于GDI+(Graphics)图像处理系列之高质量缩略图

简介 动手前先解决两个问题 生成高质量的缩略图 完整示例程序源码 示例程序截图简介生成图片缩略图的功能在Web开发的工作是经常遇到的,比如用户上传一张图片作为用户头像,根据业务的需要生成若干不同尺寸的...
  • lhtzbj12
  • lhtzbj12
  • 2017-01-05 22:34
  • 1889

Linq to Entity 增,删,改,查 语句

一、增 public void Insert(ExamineeDto item) { using (var ctx = new Personne...
  • tiz198183
  • tiz198183
  • 2013-12-18 11:00
  • 1553

RxJava 学习笔记(七) --- Filtering 过滤操作

Filter 只发射通过了谓词测试的数据项 OfType ofType是filter操作符的一个特殊形式它过滤一个Observable只返回指定类型的数据 Take 只发射开始...
  • urrjdg
  • urrjdg
  • 2016-07-12 15:51
  • 3525

蓝牙打印源代码c# vs2005

  • 2009-04-06 12:42
  • 118KB
  • 下载

开发的家庭收支管理系统 (VS2008)C#+MS SQL2005 EXPRESS

  • 2010-07-29 10:14
  • 470KB
  • 下载

c# vs2010源码

  • 2015-10-16 08:56
  • 640KB
  • 下载

C# .net基础 VS2005入门教程

  • 2009-09-29 16:31
  • 8.48MB
  • 下载

俄罗斯方块C#vs2005实现

  • 2009-05-15 16:25
  • 38KB
  • 下载

C#教程第十一课:索引指示器

本节课将介绍C#的索引指示器,其目的包括: 1.了解什么是索引指示器 2.如何实现索引指示器 3.重载索引指示器 4.了解如何实现多参数的索引指示器 索引指示器并不难使用。它...
  • yingzhaom
  • yingzhaom
  • 2012-06-05 16:09
  • 146
    个人资料
    • 访问:587624次
    • 积分:8742
    • 等级:
    • 排名:第2552名
    • 原创:231篇
    • 转载:16篇
    • 译文:25篇
    • 评论:223条
    博客专栏
    文章分类
    最新评论