欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#使用Linq實現(xiàn)簡單去重處理

 更新時間:2025年02月20日 08:40:46   作者:我是蘇蘇  
這篇文章主要為大家詳細(xì)介紹了C#如何使用Linq實現(xiàn)簡單去重處理功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

一、示例代碼

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)文章

  • 基于集合的子集與集合的全排列的相關(guān)問題

    基于集合的子集與集合的全排列的相關(guān)問題

    本篇文章介紹了,集合的子集與集合的全排列的相關(guān)系列問題說明,需要的朋友參考下
    2013-05-05
  • C#中實現(xiàn)在32位、64位系統(tǒng)下自動切換不同的SQLite dll文件

    C#中實現(xiàn)在32位、64位系統(tǒng)下自動切換不同的SQLite dll文件

    這篇文章主要介紹了C#中實現(xiàn)在32位、64位系統(tǒng)下自動切換不同的SQLite dll文件,本文使用C#代碼實現(xiàn)DLL文件的切換,需要的朋友可以參考下
    2014-09-09
  • C#中使用Cache框架快速實現(xiàn)Cache操作

    C#中使用Cache框架快速實現(xiàn)Cache操作

    這篇文章介紹了C#中使用Cache框架快速實現(xiàn)Cache操作的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • C#多線程基本使用小結(jié)

    C#多線程基本使用小結(jié)

    C#多線程編程涉及Thread、Task、異步和Parallel等工具,Thread類用于創(chuàng)建獨立線程,通過Priority屬性設(shè)置優(yōu)先級,而線程池管理線程的調(diào)度和重用,本文給大家介紹C#多線程基本使用小結(jié),感興趣的朋友跟隨小編一起看看吧
    2024-10-10
  • C#反射調(diào)用拓展類方法實例代碼

    C#反射調(diào)用拓展類方法實例代碼

    這篇文章主要給大家介紹了關(guān)于C#反射調(diào)用拓展類方法的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-01-01
  • c#使用xamarin編寫撥打電話程序

    c#使用xamarin編寫撥打電話程序

    Xamarin是一個行動App開發(fā)平臺,提供跨平臺開發(fā)能力,開發(fā)人員透過Xamarin開發(fā)工具與程序語言,即可開發(fā)出iOS、Android 與Windows 等平臺的原生(Native) App 應(yīng)用程序,不須個別使用各平臺的開發(fā)工具與程序語言,
    2015-05-05
  • C# 使用BitBlt進(jìn)行窗口抓圖的示例

    C# 使用BitBlt進(jìn)行窗口抓圖的示例

    這篇文章主要介紹了C# 使用BitBlt進(jìn)行窗口抓圖的示例,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2021-01-01
  • 使用C#實現(xiàn)對任意區(qū)域任意大小的截圖

    使用C#實現(xiàn)對任意區(qū)域任意大小的截圖

    這篇文章主要為大家詳細(xì)介紹了如何使用C#實現(xiàn)簡單的截圖功能,可以對任意區(qū)域任意大小的截圖,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • c# 用ICSharpCode組件壓縮文件

    c# 用ICSharpCode組件壓縮文件

    今天,主要總結(jié)下,windows平臺下,zip的壓縮與解壓的方法,用ICSharpCode組件,有此需求的朋友可以參考下本文
    2021-06-06
  • C#將部分Controls數(shù)據(jù)導(dǎo)入對象并存入ini中的操作方法

    C#將部分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

最新評論