List<T>中的Contains和Exists有什么不同?

17

我想知道在 List<T> 中,ContainsExists 有什么不同?

它们都可以确定一个元素是否存在于 List<T> 中。

但是它们之间有什么不同呢?

// Create a list of parts.
List<Part> parts = new List<Part>();

// Add parts to the list.
parts.Add(new Part() { PartName = "crank arm", PartId = 1234 });
parts.Add(new Part() { PartName = "chain ring", PartId = 1334 });
parts.Add(new Part() { PartName = "regular seat", PartId = 1434 });
parts.Add(new Part() { PartName = "banana seat", PartId = 1444 });
parts.Add(new Part() { PartName = "cassette", PartId = 1534 });
parts.Add(new Part() { PartName = "shift lever", PartId = 1634 }); ;

// of the Part class, which checks the PartId for equality.
Console.WriteLine("\nContains: Part with Id=1444: {0}",
parts.Contains(new Part { PartId = 1444, PartName = "" }));

// Check if an item with Id 1444 exists.
Console.WriteLine("\nExists: Part with Id=1444: {0}",
                  parts.Exists(x => x.PartId == 1444)); 

// result
// Contains: Part with Id=1444: True 
// Exists: Part with Id=1444: True 

可能是重复的问题,或者至少与以下问题相关:https://dev59.com/LmMl5IYBdhLWcg3wJUEC - gregswiss
你确定吗?由于你创建了一个新实例,所以“Contains”应该返回“False”。 - Jerry Bian
我确信 :) 这段代码是从MSDN复制过来的,我只是编辑了一些代码。 - Vic
5个回答

24

ExistsContains方法看起来很相似,但用途不同。

Exists:确定List<T>中是否存在与指定谓词定义的条件匹配的元素。

Contains:确定一个元素是否在List<T>中。

List<T>.Exists()检查列表中是否有任何项目满足特定条件(作为谓词指定)。"谓词"只是一个接受待测试项目并返回true(匹配)或false的方法。


8
  1. Exists 是 List 的一个方法,数组或 IEnumerable 扩展中没有此方法。

  2. 正确的用法语法是 x => s.Exists(y => y == x.id) (您应该传递谓词,即返回布尔值的方法)

  3. 区别在于 - Contains 可由 Linq to Entities 支持,而 Exists 不支持。

看起来你从这里获取了代码,是吗?查看此处的线程,因为它提出了类似的问题。希望能有所帮助!


2
这对我在核心3.1方面有所帮助(从2.1升级)-由于EF更改,我遇到了一个破坏性的查询问题。 - egmfrs

3

Exists可以使用任何函数。Contains取决于元素类型中.Equals的实现,并且需要创建一个新的Part对象来与列表中的对象进行比较。


3
你发布的代码与List<T>.Exists MSDN页面上的示例代码非常相似,它清楚地展示了使用Contains进行除简单成员测试外的其他操作的复杂性。查看该页面上的代码,你会发现他们实现了IComparable<T>接口以允许通过PartId进行搜索,这意味着你不能通过其他方式进行搜索。好的一面是,如果你只想检查一个List是否包含特定对象实例,并且该对象的类型没有实现IComparable<T>,那么这样做是相当快速的。

另一方面,List<T>.Exists允许你指定任何评估 - 简单或复杂 - 而不将程序锁定为比较该对象的特定规则集。

正如Spider_Says_hi在另一个答案中提到的,Contains也存在于LINQ中,并且表现类似,明显的条件是它不能保证在所有LINQ变体(LINQ to SQL,LINQ to Entities等)中都表现相同。 List<T>.Exists的等效LINQ方法是IEnumerable<T>.Any


2

在您的示例中,Exists方法中定义了比较的条件。在Contains方法中,默认使用EqualityComparer进行比较,除非您重写了Equals方法。所以,您需要知道它使用的比较方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接