C#使用Linq實(shí)現(xiàn)簡(jiǎn)單去重處理
一、示例代碼
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public static void Main()
{
// 創(chuàng)建一些示例實(shí)體對(duì)象
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
三、注意雷點(diǎn)
以下代碼不能完成全字段去重,因?yàn)閜eople是引用類型,Distinct() 一般用于List<string>,List<int>這些值類型去重,而不涉及引用類型的字段比較。
people.Distinct().ToList()
若需要全字段去重:1.使用DinstinctBy語(yǔ)法,加上所有字段。2.使用標(biāo)題四的封裝方法(反射實(shí)現(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)識(shí)符
.Select(group => group.First()); // 取每組的第一個(gè)元素
}2.示例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
public class Program
{
public static void Main()
{
// 創(chuàng)建一些示例實(shí)體對(duì)象
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)識(shí)符
.Select(group => group.First()); // 取每組的第一個(gè)元素
}
}
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public string City { get; set; }
}以上就是C#使用Linq實(shí)現(xiàn)簡(jiǎn)單去重處理的詳細(xì)內(nèi)容,更多關(guān)于C# Linq去重的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#動(dòng)態(tài)加載dll擴(kuò)展系統(tǒng)功能的方法
這篇文章主要介紹了C#動(dòng)態(tài)加載dll擴(kuò)展系統(tǒng)功能的方法,涉及C#動(dòng)態(tài)加載dll擴(kuò)展的相關(guān)技巧,需要的朋友可以參考下2015-04-04
C#使用AForge實(shí)現(xiàn)調(diào)用攝像頭的示例詳解
AForge是一個(gè)專門為開發(fā)者和研究者基于C#框架設(shè)計(jì)的,這個(gè)框架提供了不同的類庫(kù)和關(guān)于類庫(kù)的資源,本文為大家介紹了C#使用AForge實(shí)現(xiàn)調(diào)用攝像頭的相關(guān)教程,需要的可以了解下2023-11-11
C#實(shí)現(xiàn)格式化文本并導(dǎo)入到Excel
這篇文章主要為大家詳細(xì)介紹了如何使用C#實(shí)現(xiàn)格式化文本并導(dǎo)入到Excel,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-05-05
Unity游戲開發(fā)中必備的設(shè)計(jì)模式之外觀模式詳解
外觀模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,為復(fù)雜系統(tǒng)提供了簡(jiǎn)單的接口,使得子系統(tǒng)間的通信更加簡(jiǎn)潔和易于維護(hù)。在Unity游戲開發(fā)中,外觀模式可以幫助開發(fā)者更好地管理游戲?qū)ο蠛徒M件等復(fù)雜結(jié)構(gòu)2023-05-05
C#的WebBrowser的操作與注意事項(xiàng)介紹
C#的WebBrowser的操作與注意事項(xiàng)介紹,需要的朋友可以參考一下2013-03-03
Unity實(shí)現(xiàn)透視滑動(dòng)列表
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)透視滑動(dòng)列表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07

