在 C# 中使用 Except 和 Intersect 比较集合
阅读:27
点赞:0
在 C# 中,我们可以利用 Except
和 Intersect
两个扩展方法来匹配唯一元素以及查找两个集合之间的不匹配元素。本文将以用户模型的两个列表为例,通过邮箱和手机号码进行比较。
一、定义用户模型
首先,我们定义一个 User
类来表示用户信息:
public class User
{
public int Id { get; set; } // 用户 ID
public string FirstName { get; set; } // 用户名
public string LastName { get; set; } // 用户姓氏
public string MobileNumber { get; set; } // 手机号码
public string Email { get; set; } // 电子邮件
}
接下来,我们创建两个用户列表。
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" }
};
二、Except 方法
Except
方法用于返回第一个集合中不在第二个集合中的元素。假设我们要查找在 collection1
中但不在 collection2
中的用户信息,我们可以使用以下代码:
Console.WriteLine("------Except-------");
// 选择要比较的属性:手机号码和电子邮件
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));
输出
Non-Matched Elements: [...]
Non-Matched Collection: [...]
三、Intersect 方法
Intersect
方法用于返回两个集合中都存在的元素。若我们想查找同时存在于 collection1
和 collection2
的用户信息,可以使用以下代码:
Console.WriteLine("\n------Intersect-------");
// 选择要比较的属性:手机号码和电子邮件
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));
输出
Matched Elements: [...]
Matched Collection: [...]
四、结论
通过使用 Except
方法,我们可以获取在 collection1
中但不在 collection2
中的用户信息,而通过 Intersect
方法则可以获取在两个集合中都存在的用户信息。这两个方法非常适合用于比较两个列表或数组,并找出匹配和不匹配的元素,形成新的结果集合。
这使得处理集合时更加高效和简便,提升了代码的可读性和可维护性。