C#使用Linq實現(xiàn)簡單去重處理
一、示例代碼
using System; using System.Collections.Generic; using System.Linq; public class Program { public static void Main() { // 創(chuàng)建一些示例實體對象 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" },//重復(fù)的 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)去重結(jié)果,重復(fù)則保留第一條:"); 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)去重結(jié)果,重復(fù)則保留第一條:"); 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)去重結(jié)果,重復(fù)則保留第一條:
Name: Alice, Age: 30, City: New York
Name: Bob, Age: 25, City: Los Angeles
Name: Charlie, Age: 35, City: Chicago
指定字段(Name, Age)去重結(jié)果,重復(fù)則保留第一條:
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.使用標(biāo)題四的封裝方法(反射實現(xiàn)全字段去重)。
四、全字段去重封裝方法
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)))) // 按所有字段值連接生成唯一標(biāo)識符 .Select(group => group.First()); // 取每組的第一個元素 }
2.示例
using System; using System.Collections.Generic; using System.Linq; using System.Reflection; public class Program { public static void Main() { // 創(chuàng)建一些示例實體對象 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" } }; // 調(diào)用封裝的去重方法 var uniquePeople = DistinctByAllFields(people).ToList(); Console.WriteLine("根據(jù)所有字段去重的結(jié)果:"); 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)))) // 按所有字段值連接生成唯一標(biāo)識符 .Select(group => group.First()); // 取每組的第一個元素 } } public class Person { public string Name { get; set; } public int Age { get; set; } public string City { get; set; } }
以上就是C#使用Linq實現(xiàn)簡單去重處理的詳細(xì)內(nèi)容,更多關(guān)于C# Linq去重的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#中實現(xiàn)在32位、64位系統(tǒng)下自動切換不同的SQLite dll文件
這篇文章主要介紹了C#中實現(xiàn)在32位、64位系統(tǒng)下自動切換不同的SQLite dll文件,本文使用C#代碼實現(xiàn)DLL文件的切換,需要的朋友可以參考下2014-09-09C#將部分Controls數(shù)據(jù)導(dǎo)入對象并存入ini中的操作方法
在Winform設(shè)計中,經(jīng)常需要將控件數(shù)據(jù)導(dǎo)出到屬性或字段中,本文詳細(xì)介紹了如何優(yōu)化這一過程,包括控件和屬性的遍歷,以及使用FieldInfo的getSet函數(shù)和Ini類庫來實現(xiàn)數(shù)據(jù)的有效存儲和轉(zhuǎn)換,感興趣的朋友跟隨小編一起看看吧2024-10-10