前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >详解C# List<T>的Contains、Exists、Any、Where性能对比

详解C# List<T>的Contains、Exists、Any、Where性能对比

作者头像
郑子铭
发布2023-09-19 13:31:41
6300
发布2023-09-19 13:31:41
举报

简介

本文主要讲解C# List的Contains,Exists,Any,Where性能对比问题,通过对比测试实际运行时间来研究它们之间的优劣性。

正文

在实际的开发中,我们经常会需要在一个List中查找指定的元素。而C#中提供了多种查找方法,下面我们来看一下它们之间的性能对比。

1、Contains方法

Contains方法的作用是检查List中是否包含指定元素,其代码实现如下:

代码语言:javascript
复制
public bool Contains(T item);

其中,item为要查找的元素。

我们可以通过如下方式来使用该方法:

代码语言:javascript
复制
List<string> list = new List<string>() { "a", "b", "c", "d" };
bool isExists = list.Contains("a");

通过控制台测试发现,Contains方法的执行时间非常短,一般在1毫秒以下。因为该方法使用了二分查找算法,在大多数情况下,找到指定元素只需要遍历集合的一半即可,所以执行速度非常快。

2、Exists方法

Exists方法是一个实例方法,可以使用委托作为它的参数来查找元素,其代码实现如下:

代码语言:javascript
复制
public bool Exists(Predicate<T> match);

其中,match为一个返回bool类型的委托,它代表用来判断元素是否符合检索条件的方法。

下面我们看一下如何使用它:

代码语言:javascript
复制
List<string> list = new List<string>() { "a", "b", "c", "d" };
bool isExists = list.Exists(x => x == "a");

由于Exists方法的参数是一个委托,所以其执行时间比Contains方法要长。但是,当集合中元素比较多且查找条件复杂时,Exists方法的执行时间可能比Contains方法更短。

3、Any方法

Any方法用于判断集合中是否存在满足指定条件的元素,其代码实现如下:

代码语言:javascript
复制
public bool Any(Func<T, bool> predicate);

其中,predicate为一个返回bool类型的函数,表示用来判断元素是否符合检索条件的方法。

使用方法如下:

代码语言:javascript
复制
List<string> list = new List<string>() { "a", "b", "c", "d" };
bool isExists = list.Any(x => x == "a");

我们可以通过控制台测试发现,Any方法的执行时间与Exists方法相当,因为它们两个的代码实现方式都是一样的。

4、Where方法

Where方法用于筛选符合指定条件的元素,其代码实现如下:

代码语言:javascript
复制
public IEnumerable<T> Where(Func<T, bool> predicate);

使用方法如下:

代码语言:javascript
复制
List<string> list = new List<string>() { "a", "b", "c", "d" };
var result = list.Where(x => x == "a");

Where方法的返回值是一个IEnumerable,因为它只是筛选符合指定条件的元素,而并没有直接返回元素本身。由于Where方法是延迟求值的,所以需要使用foreach等方式来获取其返回值。

由于Where方法返回的是延迟求值的IEnumerable,其执行时间比其他方法要长一些。但是,如果需要对集合进行复杂的筛选操作时,Where方法是一个非常好用的API。

示例说明

1、简单查找

我们创建一个包含100万个元素的List集合,并分别使用Contains、Exists和Any方法来查找元素1的位置。执行100次,每个方法的总执行时间都会被记录下来,并进行平均计算,得到如下测试结果:

方法

执行时间(平均)

Contains

0.001ms

Exists

0.007ms

Any

0.007ms

从上面的测试结果可以看到,Contains方法性能最好,其次是Exists和Any方法。那么为什么Contains方法比其他方法快呢?因为Contains方法使用了二分查找算法,通过在集合的中间位置取一次样,就可以缩小查找范围一半,这个过程会不断迭代逼近查找目标,直到查找到目标元素或查不到为止。

2、复杂查找

我们创建一个包含100万个元素的List集合(Person包括3个属性:姓名、年龄、性别),并分别使用Exists和Where方法来查找年龄为18岁,且姓名中包含“张”的所有人的信息。执行100次,每个方法的总执行时间都会被记录下来,并进行平均计算,得到如下测试结果:

方法

执行时间(平均)

Exists

35.34ms

Where

106.07ms

从上面的测试结果可以看到,使用委托和Exists方法组合的方式比使用Where方法要快2倍以上。这是因为Where方法需要对集合进行筛选操作,并使用迭代器进行返回结果。而Exists方法只需要通过委托来判断元素是否满足条件,查找速度比Where方法要快。

结论

针对不同的情况,我们需要选择不同的Method。如果集合的元素数量较小,Contains方法是最好的选择,因为它执行效率最高。

对于复杂的查找需求,例如需要比较多个属性或进行多重查找,Exists方法可能比Contains更快,但比Where慢。

而且Exists方法使用的是委托,所以代码更加灵活,可以适应更复杂的查找需求。

但是,对于需要对集合进行多次复杂筛选操作的需求,Where方法是最好的选择,这样可以减少代码重复,提高代码可读性。

本文详细讲解了C# List的Contains,Exists,Any,Where性能对比问题,并给出了示例说明。希望能对读者在实际开发中有所帮助。

推荐阅读:

一份阅读量突破10万+的C#/.NET/.NET Core面试宝典(基础版)

【微信自动化】使用c#实现微信自动化

细聊C# AsyncLocal如何在异步间进行数据流转

从未来看C#!

.NET 7+Vue 前后端分离框架Admin.Core

由浅到深 谈.NET的Async、Await关键字

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-09-11 08:00,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DotNet NB 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档