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.自定义对象未实现相等比较

  • 如果列表元素是自定义类,Distinct() 默认使用引用相等(比较内存地址),而非属性值。
  • 解决方法
    • 重写 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.需要指定去重依据(匿名对象/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();
      

完整代码示例

场景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() 转换结果并重新赋值
自定义对象未实现相等比较重写 Equals 和 GetHashCode 或使用 IEqualityComparer<T>
需按属性去重使用 .DistinctBy() (推荐) 或 GroupBy + First()

确保根据你的 .NET 版本和场景选择合适的方法!

到此这篇关于C# List.Distinct() 去重问题解决的文章就介绍到这了,更多相关C# List.Distinct() 去重内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

最新评论