C# List.Distinct() 去重問題解決
更新時間:2026年01月28日 11:01:36 作者:進階的小木樁
本文主要介紹了C# List.Distinct() 去重問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
在 C# 中,List.Distinct() 方法沒有去重通常是因為以下原因。以下是詳細解釋和解決方案:
常見原因及解決方案
1.未正確使用返回值(未重新賦值)
Distinct()不會修改原列表,而是返回一個去重后的新序列。- 錯誤用法:
myList.Distinct(); // 未接收返回值,原列表不變
- 正確用法:
myList = myList.Distinct().ToList(); // 轉換為List并重新賦值
2.自定義對象未實現(xiàn)相等比較
- 如果列表元素是自定義類,
Distinct()默認使用引用相等(比較內存地址),而非屬性值。 - 解決方法:
- 重寫
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(); // 結果: [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" } // 重復項
};
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();
關鍵總結
| 問題原因 | 解決方案 |
|---|---|
| 未接收返回值 | 用 .ToList() 轉換結果并重新賦值 |
| 自定義對象未實現(xiàn)相等比較 | 重寫 Equals 和 GetHashCode 或使用 IEqualityComparer<T> |
| 需按屬性去重 | 使用 .DistinctBy() (推薦) 或 GroupBy + First() |
確保根據(jù)你的 .NET 版本和場景選擇合適的方法!
到此這篇關于C# List.Distinct() 去重問題解決的文章就介紹到這了,更多相關C# List.Distinct() 去重內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
使用C# Winform應用程序獲取網(wǎng)頁源文件的解決方法
本篇文章是對使用C# Winform應用程序獲取網(wǎng)頁源文件的方法進行了詳細的分析介紹,需要的朋友參考下2013-05-05
c#實現(xiàn)用SQL池,多線程定時批量執(zhí)行SQL語句的方法
構建SQL池,分離業(yè)務邏輯層和數(shù)據(jù)訪問層,讓業(yè)務邏輯層從低效的數(shù)據(jù)庫操作解脫,以提高系統(tǒng)整體性能2013-10-10
C# IEnumerable和IEnumerator接口淺析
本文主要介紹了C#中IEnumerable和IEnumerator接口的相關知識,具有很好的參考價值,下面跟著小編一起來看下吧2017-02-02

