" />

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

C# List.Distinct() 去重問(wèn)題解決

 更新時(shí)間:2026年01月28日 11:01:36   作者:進(jìn)階的小木樁  
本文主要介紹了C# List.Distinct() 去重問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

在 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ě) EqualsGetHashCode
      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ù)(匿名對(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();
      

完整代碼示例

場(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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

吴旗县| 内黄县| 师宗县| 积石山| 五大连池市| 南漳县| 惠东县| 峡江县| 西乌珠穆沁旗| 曲水县| 罗定市| 东山县| 社会| 绵竹市| 大连市| 乐安县| 尼玛县| 花莲县| 南汇区| 东阳市| 无棣县| 通海县| 华池县| 黎城县| 黄山市| 茂名市| 建昌县| 镇安县| 宝丰县| 饶平县| 泸州市| 周口市| 陆川县| 邹平县| 库车县| 江北区| 明水县| 富平县| 镇赉县| 福泉市| 黄骅市|