在 C# 中使用 Except 和 Intersect 比较集合

发布:2024-10-08 23:23 阅读:27 点赞:0

在 C# 中,我们可以利用 ExceptIntersect 两个扩展方法来匹配唯一元素以及查找两个集合之间的不匹配元素。本文将以用户模型的两个列表为例,通过邮箱和手机号码进行比较。

一、定义用户模型

首先,我们定义一个 User 类来表示用户信息:

public class User
{
    public int Id { getset; } // 用户 ID
    public string FirstName { getset; } // 用户名
    public string LastName { getset; } // 用户姓氏
    public string MobileNumber { getset; } // 手机号码
    public string Email { getset; } // 电子邮件
}

接下来,我们创建两个用户列表。

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 方法用于返回两个集合中都存在的元素。若我们想查找同时存在于 collection1collection2 的用户信息,可以使用以下代码:

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 方法则可以获取在两个集合中都存在的用户信息。这两个方法非常适合用于比较两个列表或数组,并找出匹配和不匹配的元素,形成新的结果集合。

这使得处理集合时更加高效和简便,提升了代码的可读性和可维护性。