最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

.NET高效實現(xiàn)List集合去重的多種方法詳解

 更新時間:2026年02月06日 08:28:00   作者:大黃評測  
在 .NET 開發(fā)中,處理集合數(shù)據(jù)時經(jīng)常會遇到需要對 List<T> 進行去重的場景,本文將系統(tǒng)介紹幾種常用且性能良好的去重方法,并對比其適用場景,希望對大家有所幫助

在 .NET 開發(fā)中,處理集合數(shù)據(jù)時經(jīng)常會遇到需要對 List<T> 進行去重的場景。無論是基本類型(如 int、string)還是自定義對象,.NET 提供了多種簡潔高效的去重方式。本文將系統(tǒng)介紹幾種常用且性能良好的去重方法,并對比其適用場景。

一、使用 LINQ 的 Distinct() 方法(最常用)

LINQ 提供了最簡潔的去重方式:Distinct() 擴展方法。

1. 基本類型去重

var numbers = new List<int> { 1, 2, 2, 3, 4, 4, 5 };
var uniqueNumbers = numbers.Distinct().ToList();
// 結果: [1, 2, 3, 4, 5]

2. 自定義對象去重(需實現(xiàn) IEqualityComparer 或重寫 Equals/GetHashCode)

若直接對自定義類調(diào)用 Distinct(),默認比較的是引用(除非重寫了 EqualsGetHashCode)。

方式 A:重寫 Equals 和 GetHashCode

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }

    public override bool Equals(object obj) => obj is Person p && Name == p.Name && Age == p.Age;
    public override int GetHashCode() => HashCode.Combine(Name, Age);
}

var people = new List<Person>
{
    new Person { Name = "Alice", Age = 30 },
    new Person { Name = "Alice", Age = 30 },
    new Person { Name = "Bob", Age = 25 }
};

var uniquePeople = people.Distinct().ToList(); // 自動去重

方式 B:使用自定義 IEqualityComparer

public class PersonNameComparer : IEqualityComparer<Person>
{
    public bool Equals(Person x, Person y) => x?.Name == y?.Name;
    public int GetHashCode(Person obj) => obj?.Name?.GetHashCode() ?? 0;
}

var uniqueByName = people.Distinct(new PersonNameComparer()).ToList();

二、使用 HashSet(高性能推薦)

HashSet<T> 天然具有去重特性,插入時自動忽略重復項,性能優(yōu)于 Distinct()(尤其在大數(shù)據(jù)量時)。

var numbers = new List<int> { 1, 2, 2, 3, 4, 4, 5 };
var uniqueNumbers = new HashSet<int>(numbers).ToList();

對于自定義對象,同樣需要提供合適的 IEqualityComparer<T>

var uniquePeople = new HashSet<Person>(people, new PersonNameComparer()).ToList();

優(yōu)點:時間復雜度接近 O(n),適合頻繁去重或大數(shù)據(jù)集。

注意HashSet 不保證元素順序(但 .NET Core 6+ 的 HashSet 在某些情況下保持插入順序,不建議依賴此行為)。

三、使用 ToLookup / GroupBy(按條件去重)

如果需要“保留第一個出現(xiàn)的元素”并按特定字段去重,可結合 GroupBy

var uniquePeople = people
    .GroupBy(p => p.Name)
    .Select(g => g.First())
    .ToList();

這種方式靈活,適用于復雜去重邏輯(如保留最新記錄、按多個字段分組等)。

四、.NET 6+ 新特性:DistinctBy()

從 .NET 6 開始,LINQ 新增了 DistinctBy() 方法,無需實現(xiàn)比較器即可按屬性去重:

var uniquePeople = people.DistinctBy(p => p.Name).ToList();
// 或按多個屬性
var uniqueByBoth = people.DistinctBy(p => new { p.Name, p.Age }).ToList();

強烈推薦:代碼簡潔、語義清晰、性能良好,是現(xiàn)代 .NET 項目的首選方案。

五、性能與選型建議

方法適用場景是否保序性能.NET 版本要求
Distinct()簡單去重,已重寫 Equals/GetHashCode中等所有版本
HashSet<T>大數(shù)據(jù)量、高頻去重否(通常)所有版本
GroupBy + First按條件去重、需控制保留邏輯中等所有版本
DistinctBy()按屬性去重、代碼簡潔.NET 6+

總結

對于 基本類型,直接使用 Distinct() 即可。

對于 自定義對象

  • 若使用 .NET 6 及以上,優(yōu)先使用 DistinctBy();
  • 若需兼容舊版本,可選擇 GroupBy 或實現(xiàn) IEqualityComparer<T>
  • 若追求極致性能且不關心順序,使用 HashSet<T>。

合理選擇去重方式,不僅能提升代碼可讀性,還能顯著優(yōu)化程序性能。希望本文能幫助你在 .NET 項目中高效處理集合去重問題!

到此這篇關于.NET高效實現(xiàn)List集合去重的多種方法詳解的文章就介紹到這了,更多相關.NET List集合去重內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論

盱眙县| 高密市| 临洮县| 北票市| 罗山县| 济阳县| 泗水县| 肃南| 平利县| 塔城市| 定结县| 广州市| 金阳县| 上林县| 明光市| 柘荣县| 万全县| 伊宁县| 儋州市| 全椒县| 高清| 色达县| 兴化市| 扎囊县| 灌南县| 西昌市| 乌拉特中旗| 青田县| 恭城| 安宁市| 伊金霍洛旗| 台江县| 崇仁县| 名山县| 手游| 凤台县| 南部县| 云龙县| 高清| 调兵山市| 临武县|