前言
.NET 提供了集合類型,它存儲了一組數(shù)據(jù)。我們有時會在兩個集合中進(jìn)行比較,匹配或不不匹配的元素。本文探討Except與Intersect兩個用來比較兩個集合中的唯一元素和找出不匹配的元素擴(kuò)展方法。
except
except是在二個集合比較中,找出在第一集合中有而第二個集合中沒有的元素集,這種操作我們可稱求差集。
例如:我們有兩個用戶實體列表集合,當(dāng)需要找出一個列表中可用,但在第二個列表中不可用的元素時。則可以使用except方法來實現(xiàn)。下面為示例代碼:
定義用戶實體類:
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public string Mobile { get; set; }
public string Password { get; set; }
}
定義二個用戶實體列表:
// 第一個列表集合
List<User> szUsers = new()
{
new User { Id = 1001, Name = "李華", Mobile = "13698765432", Email = "lihua@qq.com",Password="lh123456" },
new User { Id = 1002, Name = "小明", Mobile = "13677765432", Email = "xiaoming@qq.com",Password="xm123456" },
new User { Id = 1003, Name = "小米", Mobile = "123588887654", Email = "xiaomi@qq.com",Password="xm123456" }
};
// 第二個列表集合
List<User> gzUsers = new()
{
new User { Id=1004, Name="李華", Mobile="13698765432", Email="lihua@qq.com",Password="lh123456"},
new User { Id=1005, Name="小明", Mobile="13677765432", Email="xiaoming@qq.com",Password="xm123456" },
new User { Id=1006, Name="小強(qiáng)", Mobile="13499987654", Email="xiaoqiang@qq.com",Password="xq123456" }
};
使用except 實現(xiàn)比較
using System.Text.Encodings.Web;
using System.Text.Json;
namespace Fountain.WinConsole.ExampleDemo
{
internal class Program
{
static void Main(string[] args)
{
// 配置選項
var options = new JsonSerializerOptions
{
// 允許字符通過而不進(jìn)行轉(zhuǎn)義方面更加寬松
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
};
// 比較每個元素,直接使用整個集合
List<User> diffnCollection = szUsers.Except(gzUsers).ToList();
Console.WriteLine($"不匹配集合:\r\n{JsonSerializer.Serialize(diffnCollection, options)}");
Console.WriteLine();
// 根據(jù)一些選定的元素檢查未匹配的元素
var unMatchedElements = szUsers.Select(s => new { s.Mobile, s.Email }).Except(gzUsers.Select(s => new { s.Mobile, s.Email })).ToList();
Console.WriteLine($"不匹配元素:\r\n{JsonSerializer.Serialize(unMatchedElements, options)} ");
Console.WriteLine();
List<User> mismatchedCollection = szUsers.Where(x => unMatchedElements.Any(a => a.Email == x.Email) && unMatchedElements.Any(a => a.Mobile == x.Mobile)).ToList();
Console.WriteLine($"不匹配集合:\r\n{JsonSerializer.Serialize(mismatchedCollection, options)}");
Console.ReadKey();
}
}
}
intersect
intersect是二個集合比較中,找出在第一集合與第二個集合中共有的元素集,這種操作我們可稱求交集。
例如:我們有兩個用戶實體列表集合,當(dāng)需要找出二個列表中相同元素時。則可以使用intersect方法來實現(xiàn)。下面為示例代碼:
using System.Text.Encodings.Web;
using System.Text.Json;
namespace Fountain.WinConsole.ExampleDemo
{
internal class Program
{
static void Main(string[] args)
{
// 配置選項
var options = new JsonSerializerOptions
{
// 允許字符通過而不進(jìn)行轉(zhuǎn)義方面更加寬松
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
};
// 使用 intersect 匹配比較
var matchedElesments = szUsers.Select(s => new { s.Mobile, s.Email }).Intersect(gzUsers.Select(s => new { s.Mobile, s.Email })).ToList();
Console.WriteLine($"匹配元素: \r\n{JsonSerializer.Serialize(matchedElements, options)}");
Console.WriteLine();
//
List<User> matchedCollection = szUsers.Where(x => matchedElements.Any(a => a.Email == x.Email) && matchedElements.Any(a => a.Mobile == x.Mobile)).ToList();
Console.WriteLine($"匹配集合: \r\n{JsonSerializer.Serialize(matchedCollection, options)}");
Console.ReadKey();
}
}
}
下面再使用一個簡單示例,演示了如何使用 Intersect 方法來獲取兩個集合的交集:
using System;
using System.Collections.Generic;
namespace Fountain.WinConsole.ExampleDemo
{
class Program
{
static void Main()
{
// 創(chuàng)建兩個集合
List<int> intList = new List<int> { 1, 2, 3, 4, 5 };
List<int> list = new List<int> { 4, 5, 6, 7, 8 };
// 使用 Intersect 方法獲取交集
List<int> intersection = intList.Intersect(list).ToList();
// 輸出交集
Console.WriteLine("匹配集合: " + string.Join(", ", intersection));
}
}
}
小結(jié)
以上,通過使用except方法和intersect方法實現(xiàn)兩個集合比較示例,了解其使用方法。它們在對集合進(jìn)行比較時,也是可以使用的方式。
該文章在 2024/12/2 9:45:01 編輯過