C# 中的集合比较:两种实用方法

68 阅读3分钟

前言

在C#中,我们有两个扩展方法可以用来比较两个集合中的唯一元素和找出不匹配的元素,分别是ExceptIntersect

正文

本文将探讨两个用户模型列表,并使用电子邮件和手机号字段进行比对。

List<User> collection1 = new() {  
    new User { Id=1, FirstName="first1", LastName="last1", MobileNumber="9876543210", Email="email1@domain.com" },  
    new User { Id=2, FirstName="first2", LastName="last2", MobileNumber="7776543210", Email="email2@domain.com" },  
    new User { Id=3, FirstName="first3", LastName="last3", MobileNumber="8888765432", Email="email3@domain.com" } 
};  
  
List<User> collection2 = new() {  
    new User { Id=4, FirstName="first1coll2", LastName="last1coll2", MobileNumber="9876543210", Email="email1@domain.com" },  
    new User { Id=5, FirstName="first2coll2", LastName="last2coll2", MobileNumber="7776543210", Email="email2@domain.com" },  
    new User { Id=6, FirstName="first3coll2", LastName="last3coll2", MobileNumber="9998765432", Email="emailnew3@domain.com" }  
};  

1、Except

Except方法返回第一个集合中与第二个集合不匹配的元素。

如果我们有两个列表,并希望找出仅存在于第一个列表中、而不在第二个列表中的元素,就可以使用Except,它会返回一个不包含匹配项的新集合。
Except总是返回第一个集合中未出现在第二个集合中的元素。

代码示例:

Console.WriteLine("------Except-------");  
// 可以直接使用整个集合进行比较,例如:collection1.Except(collection2).ToList();  
// 这里我们将根据选定的字段检查未匹配的元素。  
// 它将返回collection1中未出现在collection2中的元素。  
var nonMatchedElements = collection1.Select(s => new { s.MobileNumber, s.Email })  
    .Except(collection2.Select(s => new { s.MobileNumber, s.Email })).ToList();  
Console.WriteLine("Non-Matched Elements: " + JsonSerializer.Serialize(nonMatchedElements));  
  
List<User> nonMatchedCollection = collection1  
    .Where(x => nonMatchedElements.Any(a => a.Email == x.Email) && nonMatchedElements.Any(a => a.MobileNumber == x.MobileNumber))  
    .ToList();  
Console.WriteLine("Non-Matched Collection: " + JsonSerializer.Serialize(nonMatchedCollection));  

输出:

2、Intersect

Intersect方法返回两个集合中的匹配项。如果我们希望找出两个列表中都有的元素,可以使用Intersect扩展方法。

同样,Intersect也会返回第一个集合中与第二个集合匹配的元素。代码示例:

Console.WriteLine("\n------Intersect-------");  
  
// 可以直接使用整个集合进行比较,例如:collection1.Intersect(collection2).ToList();  
// 这里我们将根据选定的字段检查匹配的元素。  
// 它将返回collection1中出现在collection2中的元素。  
var matchedElements = collection1.Select(s => new { s.MobileNumber, s.Email })  
    .Intersect(collection2.Select(s => new { s.MobileNumber, s.Email })).ToList();  
Console.WriteLine("Matched Elements: " + JsonSerializer.Serialize(matchedElements));  
  
List<User> matchedCollection = collection1  
    .Where(x => matchedElements.Any(a => a.Email == x.Email) && matchedElements.Any(a => a.MobileNumber == x.MobileNumber))  
    .ToList();  
Console.WriteLine("Matched Collection: " + JsonSerializer.Serialize(matchedCollection));  

输出:

总结

在使用Except方法时,比较两个字段——电子邮件和手机号,它返回collection1中与collection2不匹配的元素;而使用Intersect时,它返回基于这两个字段的匹配元素。

因此,如果你想通过某些字段来比较两个列表或数组,并找出匹配和不匹配的元素作为新的结果集合,那么这两个方法非常有用。

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。

也可以加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!

优秀是一种习惯,欢迎大家留言学习!

译文:c-sharpcorner.com/blogs/comparing-collections-in-c-sharp-using-except-and-intersect-to-find-matched-and-unmatched-elements

声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!