当前位置: 代码网 > it编程>编程语言>Asp.net > C#使用Linq实现简单去重处理

C#使用Linq实现简单去重处理

2025年02月20日 Asp.net 我要评论
一、示例代码using system;using system.collections.generic;using system.linq; public class program{ publ

一、示例代码

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; }
}

以上就是c#使用linq实现简单去重处理的详细内容,更多关于c# linq去重的资料请关注代码网其它相关文章!

(0)

相关文章:

  • C# 类库打包dll文件的操作流程

    前言在c#中,有多种方式可以对代码进行加密,以保护源代码不被轻易查看或修改,这篇文章主要介绍将c# cs类文件加密为dll文件的方式进行保护。操作流程在 visual studio…

    2025年03月05日 编程语言
  • C#实现一个相当全面的数据转换工具类

    C#实现一个相当全面的数据转换工具类

    c#通用工具类dataconvert,作为静态类全局可调用,来进行数据转换。包括byte[]转数字、csv、数字转byte[]、16进制数转换、tryparse... [阅读全文]
  • 基于C#实现语音合成播报器

    基于C#实现语音合成播报器

    一、语音合成播报应用场景语音合成播报器广泛应用于以下领域:工业控制:生产线异常报警、设备状态实时播报(如网页4中的wincc语音报警插件)智能服务:医院叫号系统... [阅读全文]
  • C# winform操作CSV格式文件

    C# winform操作CSV格式文件

    实例一实例效果当在winform界面中点击读取按钮时 将csv中的所有数据读取出来放置在datagridview控件,可以在datagridview控件中编辑数... [阅读全文]
  • C#加锁防止并发的几种方法详解

    前言在最近的工作中,有一个抽奖的需求。涉及到利益发放,这时候就需要加锁,防止权益的重复发放,避免对客户造成经济损失。在实际的工作中我用到的是redis分布式锁,借此机会我学习一下c…

    2025年03月06日 编程语言
  • 最新版Anaconda安装教程

    安装新的anaconda需要卸载干净上一个版本的anaconda,不然可能会在新版本安装过程或者后续使用过程中出错,完全卸载干净anaconda的方法,可以参考这篇文章!第一步:下…

    2025年03月07日 编程语言

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com