C# Find vs FirstOrDefault

标签: C# linq
2571人阅读 评论(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 ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

查看评论

Find()和First()与FirstOrDefault()区别

Find方法和FirstOrDefault方法效果相同,都是返回满足条件的第一个元素,如果没有该元素,则返回null。 那么这两个扩展方法有什么不同? 1)Find方法是.net Framework2...
  • ColorWaterer
  • ColorWaterer
  • 2014-11-17 23:30:07
  • 6013

Find和FirstOrDefault()有什么区别?

Find方法和FirstOrDefault方法效果相同,都是返回满足条件的第一个元素,如果没有该元素,则返回null。 那么这两个扩展方法有什么不同? 1)Find方法是.netFrame...
  • Accipiter_nisus
  • Accipiter_nisus
  • 2014-08-19 15:41:40
  • 1035

C# Linq First 和 FirstOrDefault的区别

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

Linq中SingleOrDefault、FirstOrDefault的用法

SingleOrDefault 只取一个 如果没有数据等于 null, 如果>1  异常 FirstOrDefault  只取一个  如果没有数据数据 null, 如果>1 取第一个...
  • libiao312
  • libiao312
  • 2013-11-22 17:54:28
  • 3136

linq语法之Where First、FirstOrDefault Single...

用途:实现条件查询,过滤目标等 Linq的Where操作包括3种形式:简单形式、关系条件形式、First()形式。 1.简单形式: 例:使用where查询在北京的客户 var q = from...
  • shan1774965666
  • shan1774965666
  • 2014-08-29 14:56:07
  • 2339

LINQ查询操作符之First、FirstOrDefault、Last、LastOrDefault、ElementAt、ElementAtOrDefault、Contains、Any、All、Coun

介绍       ·First - 返回集合中的第一个元素;不延迟       ·FirstOrDefault - 返回集合中的第一个元素(如果没有则返回默认值);不延迟       ·Last...
  • qq_30469045
  • qq_30469045
  • 2016-10-25 09:50:52
  • 284

First,FirstOrDefault,Single,SingleOrDefault 区别

First,返回序列中的第一条记录,如果没有记录,则引发异常 FirstOrDefault,返回序列中的第一条记录,如果序列中不包含任何记录,则返回默认值。 Single,返回序列中的唯一一条记录...
  • SpringFileld
  • SpringFileld
  • 2014-05-12 08:09:41
  • 1101

single character replace program 文本中单个字符的替换,支持一些特殊的字符。

文本中单个字符的替换,支持一些特殊的字符。用法:sreplace  /b   file  character1 character2作用:将file中的character1全部替换成character...
  • luodongshui
  • luodongshui
  • 2007-09-09 15:31:00
  • 651

First,FirstOrDefault,Single,SingleOrDefault的区别

First,FirstOrDefault,Single,SingleOrDefault的区别   操作符 如果源序列是空的 源序列只包含一个元素...
  • zj735539703
  • zj735539703
  • 2014-07-19 21:00:21
  • 550

.NET中First,FirstOrDefault,Single,SingleOrDefault的区别是什么

一、First 取序列中满足条件的第一个元素,如果没有元素满足条件,则抛出异常    二、FirstOrDefault 取序列中满足条件的第一个元素,如果没有元素满足条件,则返回默认值(对于可以为nu...
  • whaxrl
  • whaxrl
  • 2015-11-02 15:16:11
  • 470
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 70万+
    积分: 9981
    排名: 2179
    博客专栏
    文章分类
    最新评论