.NET中求復(fù)雜類型集合的差集、交集、并集
前言
如標(biāo)題所述,在ASP.NET應(yīng)用程序開(kāi)發(fā)中,兩個(gè)集合做比較時(shí) 我們使用微軟IEnumerable封裝的Except/Intersect/Union取 差集/交集/并集 方法是非常的方便的;
但以上對(duì)于不太熟悉的小伙伴來(lái)講,在遇到求包含引用類型(不包含string)集合時(shí)就非常的苦惱;
下面我將帶著大家去了解如何通過(guò)微軟自帶方法方式去取**復(fù)雜類型集合**的差集、交集、并集。
場(chǎng)景
這里是場(chǎng)景,我有以下兩個(gè)學(xué)生集合。
namespace Test2
{
internal class Program
{
public void Main()
{
//列表1
List<Student> StudentList1 = new List<Student>()
{
new Student {Id=1,Name="小明",Age=27 },
new Student {Id=3,Name="大郭",Age=28 },
new Student {Id=4,Name="老登",Age=29 }
};
List<Student> StudentList2 = new List<Student>()
{
new Student {Id=1,Name="小明",Age=27 },
new Student {Id=3,Name="大郭",Age=28 },
new Student {Id=4,Name="老登",Age=29 },
new Student {Id=4,Name="小路",Age=28 },
new Student {Id=4,Name="小明",Age=30 }
};
}
}
}生成兩個(gè)實(shí)體集合;
下面我們?nèi)〗患?差集/并集
完整調(diào)用示例(.NET Core):
namespace Test2
{
internal class Program
{
public static void Main()
{
//列表1
List<Student> StudentList1 = new List<Student>()
{
new Student {Id=1,Name="小明",Age=27 },
new Student {Id=2,Name="大郭",Age=28 },
new Student {Id=3,Name="老登",Age=29 }
};
//列表2
List<Student> StudentList2 = new List<Student>()
{
new Student {Id=1,Name="小明",Age=27 },
new Student {Id=2,Name="大郭",Age=28 },
new Student {Id=3,Name="老登",Age=29 },
new Student {Id=4,Name="小路",Age=28 },
new Student {Id=5,Name="小明",Age=30 }
};
//取比列表1里多出來(lái)的學(xué)生數(shù)據(jù) 并輸出
var ExceptData = StudentList2.Except(StudentList1);
Console.WriteLine("差集:" + String.Join(";", ExceptData.Select(x => { return $"{x.Id}-{x.Name}-{x.Age}"; })));
//取列表1與列表2里共有的學(xué)生數(shù)據(jù)
var IntersectData = StudentList1.Intersect(StudentList2);
Console.WriteLine("交集:" + String.Join(";", IntersectData.Select(x => { return $"{x.Id}-{x.Name}-{x.Age}"; })));
//獲取辦理所有學(xué)生的數(shù)據(jù)(一個(gè)相同的學(xué)生只能一條)
var UnionData = StudentList1.Union(StudentList2);
Console.WriteLine("并集:"+String.Join(";", UnionData.Select(x => { return $"{x.Id}-{x.Name}-{x.Age}"; })));
}
}
}輸出:
差集:1-小明-27;2-大郭-28;3-老登-29;4-小路-28;5-小明-30
交集:null
并集:1-小明-27;2-大郭-28;3-老登-29;1-小明-27;2-大郭-28;3-老登-29;4-小路-28;5-小明-30
以上輸出仔細(xì)看一下明顯是不對(duì)的,這就涉及到了復(fù)雜類型對(duì)比,請(qǐng)看代碼:
正常我們聲明的類
/// <summary>
/// 學(xué)生類
/// </summary>
internal class Student
{
/// <summary>
/// 編號(hào)
/// </summary>
public int Id { get; set; }
/// <summary>
/// 姓名
/// </summary>
public string Name { get; set; }
/// <summary>
/// 年齡
/// </summary>
public int Age { get; set; }
}因?yàn)槲覀円獙?duì)比的是引用類型,因?yàn)樵趯?duì)比除string引用類型外,其他引用類型的對(duì)比默認(rèn)都是對(duì)比的堆里地址,所以我們要實(shí)現(xiàn)一個(gè)自定義的對(duì)比方案
我們需要繼承一個(gè)接口IEqualityComparer<T> 泛型接口
如下:(這里我們以年齡與名做為對(duì)比條件)
/// <summary>
/// 學(xué)生類
/// </summary>
internal class Student : IEqualityComparer<Student>
{
/// <summary>
/// 編號(hào)
/// </summary>
public int Id { get; set; }
/// <summary>
/// 姓名
/// </summary>
public string Name { get; set; }
/// <summary>
/// 年齡
/// </summary>
public int Age { get; set; }
/// <summary>
/// 比較器
/// </summary>
/// <param name="s1">比較實(shí)體1</param>
/// <param name="s2">比較實(shí)體2</param>
/// <returns></returns>
public bool Equals(Student s1, Student s2)
{
//驗(yàn)證相等條件
if (s1.Name == s2.Name && s1.Age == s2.Age)
{
return true;
}
return false;
}
/// <summary>
/// 獲取唯一條件
/// </summary>
/// <param name="stu"></param>
/// <returns></returns>
public int GetHashCode(Student stu)
{
return (stu.Name + "|" + stu.Age).GetHashCode();
}
}修改了類后還有最重要的一點(diǎn):就是修改比較的方法(相當(dāng)于聲明一個(gè)自定義的比較器給方法)
//取比列表1里多出來(lái)的學(xué)生數(shù)據(jù) 并輸出
var ExceptData = StudentList2.Except(StudentList1,new Student());
Console.WriteLine("差集:" + String.Join(";", ExceptData.Select(x => { return $"{x.Id}-{x.Name}-{x.Age}"; })));
//取列表1與列表2里共有的學(xué)生數(shù)據(jù)
var IntersectData = StudentList1.Intersect(StudentList2,new Student());
Console.WriteLine("交集:" + String.Join(";", IntersectData.Select(x => { return $"{x.Id}-{x.Name}-{x.Age}"; })));
//獲取辦理所有學(xué)生的數(shù)據(jù)(一個(gè)相同的學(xué)生只能一條)
var UnionData = StudentList1.Union(StudentList2,new Student());
Console.WriteLine("并集:"+String.Join(";", UnionData.Select(x => { return $"{x.Id}-{x.Name}-{x.Age}"; })));輸出:
差集:4-小路-28;5-小明-30
交集:1-小明-27;2-大郭-28;3-老登-29
并集:1-小明-27;2-大郭-28;3-老登-29;4-小路-28;5-小明-30
到這里引用類型的比較已經(jīng)完成了,比較器的條件方法可以根據(jù)需求調(diào)整,如有不足之處,希望大家多多指正?。?!
到此這篇關(guān)于.NET的求復(fù)雜類型集合的差集、交集、并集的文章就介紹到這了,更多相關(guān).net差集、交集、并集內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
.NET讀寫Excel工具Spire.Xls使用 Excel單元格控制(3)
這篇文章主要為大家詳細(xì)介紹了.NET讀寫Excel工具Spire.Xls使用,Excel單元格控制,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11
.Net中異步任務(wù)的取消和監(jiān)控的具體實(shí)現(xiàn)
本文主要介紹了.Net中異步任務(wù)的取消和監(jiān)控的具體實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
ASP.NET Core中使用EPPlus導(dǎo)入出Excel文件的完整步驟
這篇文章主要給大家介紹了關(guān)于ASP.NET Core中如何使用EPPlus導(dǎo)入出Excel文件的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02
.net GridView分頁(yè)模板的實(shí)例代碼
.net GridView分頁(yè)模板的實(shí)例代碼,對(duì)分頁(yè)代碼有興趣的朋友可以參考一下2013-03-03
異步調(diào)用webservice返回responseXML為空的問(wèn)題解決方法
異步調(diào)用webservice返回responseXML為空,詳細(xì)很多朋友都遇到過(guò)類似的問(wèn)題吧,接下來(lái)為大家提供詳細(xì)的解決方案,感興趣的朋友可以參考下哈2013-04-04
.NET6使用ImageSharp實(shí)現(xiàn)給圖片添加水印
這篇文章主要為大家詳細(xì)介紹了.NET6使用ImageSharp實(shí)現(xiàn)給圖片添加水印功能的相關(guān)資料,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-12-12
ASP.NET 程序中刪除文件夾導(dǎo)致session失效問(wèn)題的解決辦法分享
這篇文章主要介紹了ASP.NET 程序中刪除文件夾導(dǎo)致session失效問(wèn)題的解決辦法分享,有需要的朋友可以參考一下2013-12-12

