C# List.Distinct() 去重問(wèn)題解決
在 C# 中,List.Distinct() 方法沒(méi)有去重通常是因?yàn)橐韵略?。以下是詳?xì)解釋和解決方案:
常見(jiàn)原因及解決方案
1.未正確使用返回值(未重新賦值)
Distinct()不會(huì)修改原列表,而是返回一個(gè)去重后的新序列。- 錯(cuò)誤用法:
myList.Distinct(); // 未接收返回值,原列表不變
- 正確用法:
myList = myList.Distinct().ToList(); // 轉(zhuǎn)換為L(zhǎng)ist并重新賦值
2.自定義對(duì)象未實(shí)現(xiàn)相等比較
- 如果列表元素是自定義類(lèi),
Distinct()默認(rèn)使用引用相等(比較內(nèi)存地址),而非屬性值。 - 解決方法:
- 重寫(xiě)
Equals和GetHashCode:public class Person { public int Id { get; set; } public string Name { get; set; } public override bool Equals(object obj) => obj is Person p && Id == p.Id && Name == p.Name; public override int GetHashCode() => HashCode.Combine(Id, Name); } - 或使用自定義比較器:
public class PersonComparer : IEqualityComparer<Person> { public bool Equals(Person x, Person y) => x.Id == y.Id && x.Name == y.Name; public int GetHashCode(Person obj) => HashCode.Combine(obj.Id, obj.Name); } // 使用比較器 var distinctList = myList.Distinct(new PersonComparer()).ToList();
- 重寫(xiě)
3.需要指定去重依據(jù)(匿名對(duì)象/LINQ)
- 使用
DistinctBy(.NET 6+) 或通過(guò)GroupBy手動(dòng)去重:- .NET 6+ 的
DistinctBy:var distinctList = myList.DistinctBy(p => p.Id).ToList();
- LINQ GroupBy:
var distinctList = myList .GroupBy(p => p.Id) // 按Id分組 .Select(g => g.First()) // 取每組第一個(gè) .ToList();
- .NET 6+ 的
完整代碼示例
場(chǎng)景1:基本類(lèi)型去重
var numbers = new List<int> { 1, 2, 2, 3 };
numbers = numbers.Distinct().ToList(); // 結(jié)果: [1, 2, 3]
場(chǎng)景2:自定義對(duì)象去重
// 方法1:重寫(xiě)Equals和GetHashCode
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public override bool Equals(object obj) =>
obj is Person p && Id == p.Id && Name == p.Name;
public override int GetHashCode() =>
HashCode.Combine(Id, Name);
}
// 使用
var people = new List<Person>
{
new Person { Id = 1, Name = "Alice" },
new Person { Id = 1, Name = "Alice" } // 重復(fù)項(xiàng)
};
var distinctPeople = people.Distinct().ToList(); // 去重成功
場(chǎng)景3:使用DistinctBy(.NET 6+)
var distinctPeople = people
.DistinctBy(p => new { p.Id, p.Name }) // 按多個(gè)屬性去重
.ToList();
場(chǎng)景4:使用自定義比較器
var distinctPeople = people
.Distinct(new PersonComparer())
.ToList();
關(guān)鍵總結(jié)
| 問(wèn)題原因 | 解決方案 |
|---|---|
| 未接收返回值 | 用 .ToList() 轉(zhuǎn)換結(jié)果并重新賦值 |
| 自定義對(duì)象未實(shí)現(xiàn)相等比較 | 重寫(xiě) Equals 和 GetHashCode 或使用 IEqualityComparer<T> |
| 需按屬性去重 | 使用 .DistinctBy() (推薦) 或 GroupBy + First() |
確保根據(jù)你的 .NET 版本和場(chǎng)景選擇合適的方法!
到此這篇關(guān)于C# List.Distinct() 去重問(wèn)題解決的文章就介紹到這了,更多相關(guān)C# List.Distinct() 去重內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C#數(shù)組去重的方法匯總
- C#實(shí)現(xiàn)List<T>去重的多種高效方法
- C#之List集合去重復(fù)對(duì)象的實(shí)現(xiàn)方法
- C#使用Linq實(shí)現(xiàn)簡(jiǎn)單去重處理
- C#集合數(shù)據(jù)去重的5種方式及對(duì)比分析
- C# list<T>去重的實(shí)現(xiàn)
- C#實(shí)現(xiàn)數(shù)據(jù)去重的方式總結(jié)
- C#中Linq的去重方式Distinct詳解
- c# linq的差集,并集,交集,去重代碼(分享)
- C#對(duì)多個(gè)集合和數(shù)組的操作方法(合并,去重,判斷)
相關(guān)文章
解析從源碼分析常見(jiàn)的基于Array的數(shù)據(jù)結(jié)構(gòu)動(dòng)態(tài)擴(kuò)容機(jī)制的詳解
本篇文章是對(duì)從源碼分析常見(jiàn)的基于Array的數(shù)據(jù)結(jié)構(gòu)動(dòng)態(tài)擴(kuò)容機(jī)制進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C++通過(guò)Callback向C#傳遞數(shù)據(jù)的方法
下面小編就為大家分享一篇C++通過(guò)Callback向C#傳遞數(shù)據(jù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
Unity實(shí)戰(zhàn)之制作動(dòng)畫(huà)編輯器
為了更方便地為UI視圖添加動(dòng)畫(huà),將動(dòng)畫(huà)的編輯功能封裝在了UI View類(lèi)中,可以通過(guò)編輯器快速的為視圖編輯動(dòng)畫(huà)。本文將通過(guò)Unity制作一個(gè)動(dòng)畫(huà)編輯器,需要的可以參考一下2022-02-02
解讀在C#中winform程序響應(yīng)鍵盤(pán)事件的詳解
本篇文章是對(duì)在C#中winform程序響應(yīng)鍵盤(pán)事件的詳細(xì)介紹,需要的朋友參考下2013-05-05
C# WinForm開(kāi)發(fā)中使用XML配置文件實(shí)例
這篇文章主要介紹了C# WinForm開(kāi)發(fā)中使用XML配置文件實(shí)例,本文詳細(xì)講解了如何使用一個(gè)XML文件作為WinForm的配置文件,需要的朋友可以參考下2014-08-08

