海哥 发表于 2025-10-27 20:45:36

C#根本:利用Linq举行简单去重处理惩罚(DinstinctBy/反射)

目次
一、示例代码
二、示例输出
三、注意雷点
四、全字段去重封装方法
1.封装
2.示例

一、示例代码

using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
    public static void Main()
    {
      // 创建一些示例实体对象
      var people = new List<Person>
      {
            new Person { Name = "Alice", Age = 30, City = "New York" },
            new Person { Name = "Bob", Age = 25, City = "Los Angeles" },
            new Person { Name = "Alice", Age = 30, City = "New York" },//重复的
            new Person { Name = "Charlie", Age = 35, City = "Chicago" },
            new Person { Name = "Alice", Age = 28, City = "San Francisco" }
      };

      // 1. 单字段去重
      var uniqueNameFields = people.DistinctBy(p =>p.Name).ToList();
      Console.WriteLine("指定字段(Name)去重结果,重复则保留第一条:");
      foreach (var person in uniqueNameFields)
      {
            Console.WriteLine($"Name: {person.Name}, Age: {person.Age}, City: {person.City}");
      }

      // 2. 多字段去重
      var uniqueNameAgeFields = people.DistinctBy(p => new { p.Name, p.Age }).ToList();
      Console.WriteLine("\n指定字段(Name, Age)去重结果,重复则保留第一条:");
      foreach (var person in uniqueNameAgeFields)
      {
            Console.WriteLine($"Name: {person.Name}, Age: {person.Age}, City: {person.City}");
      }

      //3.全字段去重
      // 通过 GroupBy 按 Name 和 Age 字段去重
      var uniquePeople = people.DistinctBy(p => new { p.Name, p.Age, p.City }).ToList();
      Console.WriteLine("\n全字段去重:");
      foreach (var person in uniquePeople)
      {
            Console.WriteLine($"Name: {person.Name}, Age: {person.Age}, City: {person.City}");
      }
    }
}

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string City { get; set; }
}
二、示例输出

指定字段(Name)去重结果,重复则保留第一条:
Name: Alice, Age: 30, City: New York
Name: Bob, Age: 25, City: Los Angeles
Name: Charlie, Age: 35, City: Chicago

指定字段(Name, Age)去重结果,重复则保留第一条:
Name: Alice, Age: 30, City: New York
Name: Bob, Age: 25, City: Los Angeles
Name: Charlie, Age: 35, City: Chicago
Name: Alice, Age: 28, City: San Francisco

全字段去重:
Name: Alice, Age: 30, City: New York
Name: Bob, Age: 25, City: Los Angeles
Name: Charlie, Age: 35, City: Chicago
Name: Alice, Age: 28, City: San Francisco 三、注意雷点

        以下代码不能完玉成字段去重,由于people是引用范例,Distinct() 一样平常用于List<string>,List<int>这些值范例去重,而不涉及引用范例的字段比力。

people.Distinct().ToList()         若必要全字段去重:1.利用DinstinctBy语法,加上全部字段。2.利用标题四的封装方法(反射实现全字段去重)。
四、全字段去重封装方法

1.封装

/// <summary>
/// 通用的全字段去重方法
/// </summary>
/// <returns></returns>
public static IEnumerable<T> DistinctByAllFields<T>(IEnumerable<T> items)
{
    // 获取 T 类型的所有字段值
    var properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);

    return items
      .GroupBy(item => string.Join(",", properties.Select(p => p.GetValue(item))))// 按所有字段值连接生成唯一标识符
      .Select(group => group.First());// 取每组的第一个元素
} 2.示例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;

public class Program
{
    public static void Main()
    {
      // 创建一些示例实体对象
      var people = new List<Person>
      {
            new Person { Name = "Alice", Age = 30, City = "New York" },
            new Person { Name = "Bob", Age = 25, City = "Los Angeles" },
            new Person { Name = "Alice", Age = 30, City = "New York" },
            new Person { Name = "Charlie", Age = 35, City = "Chicago" },
            new Person { Name = "Alice", Age = 28, City = "San Francisco" }
      };

      // 调用封装的去重方法
      var uniquePeople = DistinctByAllFields(people).ToList();

      Console.WriteLine("根据所有字段去重的结果:");
      foreach (var person in uniquePeople)
      {
            Console.WriteLine($"Name: {person.Name}, Age: {person.Age}, City: {person.City}");
      }
    }

    /// <summary>
    /// 通用的全字段去重方法
    /// </summary>
    /// <returns></returns>
    public static IEnumerable<T> DistinctByAllFields<T>(IEnumerable<T> items)
    {
      // 获取 T 类型的所有字段值
      var properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);

      return items
            .GroupBy(item => string.Join(",", properties.Select(p => p.GetValue(item))))// 按所有字段值连接生成唯一标识符
            .Select(group => group.First());// 取每组的第一个元素
    }
}

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




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: C#根本:利用Linq举行简单去重处理惩罚(DinstinctBy/反射)