C# List.Distinct() 去重問題解決
在 C# 中,List.Distinct() 方法沒有去重通常是因為以下原因。以下是詳細(xì)解釋和解決方案:
常見原因及解決方案
1.未正確使用返回值(未重新賦值)
Distinct()不會修改原列表,而是返回一個去重后的新序列。- 錯誤用法:
myList.Distinct(); // 未接收返回值,原列表不變
- 正確用法:
myList = myList.Distinct().ToList(); // 轉(zhuǎn)換為List并重新賦值
2.自定義對象未實現(xiàn)相等比較
- 如果列表元素是自定義類,
Distinct()默認(rèn)使用引用相等(比較內(nèi)存地址),而非屬性值。 - 解決方法:
- 重寫
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();
- 重寫
3.需要指定去重依據(jù)(匿名對象/LINQ)
- 使用
DistinctBy(.NET 6+) 或通過GroupBy手動去重:- .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()) // 取每組第一個 .ToList();
- .NET 6+ 的
完整代碼示例
場景1:基本類型去重
var numbers = new List<int> { 1, 2, 2, 3 };
numbers = numbers.Distinct().ToList(); // 結(jié)果: [1, 2, 3]
場景2:自定義對象去重
// 方法1:重寫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ù)項
};
var distinctPeople = people.Distinct().ToList(); // 去重成功
場景3:使用DistinctBy(.NET 6+)
var distinctPeople = people
.DistinctBy(p => new { p.Id, p.Name }) // 按多個屬性去重
.ToList();
場景4:使用自定義比較器
var distinctPeople = people
.Distinct(new PersonComparer())
.ToList();
關(guān)鍵總結(jié)
| 問題原因 | 解決方案 |
|---|---|
| 未接收返回值 | 用 .ToList() 轉(zhuǎn)換結(jié)果并重新賦值 |
| 自定義對象未實現(xiàn)相等比較 | 重寫 Equals 和 GetHashCode 或使用 IEqualityComparer<T> |
| 需按屬性去重 | 使用 .DistinctBy() (推薦) 或 GroupBy + First() |
確保根據(jù)你的 .NET 版本和場景選擇合適的方法!
到此這篇關(guān)于C# List.Distinct() 去重問題解決的文章就介紹到這了,更多相關(guān)C# List.Distinct() 去重內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解析從源碼分析常見的基于Array的數(shù)據(jù)結(jié)構(gòu)動態(tài)擴(kuò)容機(jī)制的詳解
本篇文章是對從源碼分析常見的基于Array的數(shù)據(jù)結(jié)構(gòu)動態(tài)擴(kuò)容機(jī)制進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C++通過Callback向C#傳遞數(shù)據(jù)的方法
下面小編就為大家分享一篇C++通過Callback向C#傳遞數(shù)據(jù)的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01
解讀在C#中winform程序響應(yīng)鍵盤事件的詳解
本篇文章是對在C#中winform程序響應(yīng)鍵盤事件的詳細(xì)介紹,需要的朋友參考下2013-05-05

