前言

List集合操作去除重复数据的这种情况经常会碰到,博客园里面也有很多大神们做过,在这里主要是借鉴然后自己整理了一下,主要是为了方便自己,以后再次碰到这种去重问题,直接打开自己的链接拿起键盘就是干,,,,

一、方法一

利用HashSet去重,在实体类里重写Equals和GetHashCode方法

 class Program
{
static void Main(string[] args)
{
List<UserInfo> list = new List<UserInfo>()
{
new UserInfo() { Id="", UserName=""},
new UserInfo() { Id="", UserName=""}
}; // 因为我们通常操作的是List集合,所以我在这里把list转成了HashSet类型来接受
HashSet<UserInfo> hs = new HashSet<UserInfo>(list);
foreach (var item in hs)
{
Console.WriteLine($"Id:{item.Id} UserName:{item.UserName}");
} Console.ReadKey();
} class UserInfo
{
public string Id { get; set; }
public string UserName { get; set; } public override bool Equals(object obj)
{
UserInfo user = obj as UserInfo;
return this.Id == user.Id ;
}
public override int GetHashCode()
{
return this.Id.GetHashCode();
}
}
}

二、方法二

利用拉姆达表达式Distinct方法,我们转到定义可以看到两个重载的Distinct方法,如图

我们再转到定义看看IEqualityComparer接口里面到底是个啥玩意,原来有两个方法

这时候我们来实现IEqualityComparer接口里面的方法

class Program
{
static void Main(string[] args)
{ UserInfo info = new UserInfo();
List<UserInfo> list = new List<UserInfo>()
{
new UserInfo() { Id="", UserName=""},
new UserInfo() { Id="", UserName=""}
}; list.Distinct(new DistinctCompare()).ToList().ForEach(item =>
{ Console.WriteLine($"Id:{item.Id} UserName:{item.UserName}");
}); Console.ReadKey();
} class UserInfo
{
public string Id { get; set; }
public string UserName { get; set; }
} class DistinctCompare : IEqualityComparer<UserInfo>
{
public bool Equals(UserInfo x, UserInfo y)
{
return x.Id == y.Id;//可以自定义去重规则,此处将Id相同的就作为重复记录
}
public int GetHashCode(UserInfo obj)
{
return obj.Id.GetHashCode();
}
}
}

我们再来写一个通用的扩展方法

帮助类

public static class DistinctHelper
{
/// <summary>
/// 自定义Distinct扩展方法
/// </summary>
/// <typeparam name="T">要去重的对象类</typeparam>
/// <typeparam name="C">自定义去重的字段类型</typeparam>
/// <param name="source">要去重的对象</param>
/// <param name="getfield">获取自定义去重字段的委托</param>
/// <returns></returns>
public static IEnumerable<T> DistinctEx<T, C>(this IEnumerable<T> source, Func<T, C> getfield)
{
return source.Distinct(new Compare<T, C>(getfield));
}
} public class Compare<T, C> : IEqualityComparer<T>
{
private Func<T, C> _getField;
public Compare(Func<T, C> getfield)
{
this._getField = getfield;
}
public bool Equals(T x, T y)
{
return EqualityComparer<C>.Default.Equals(_getField(x), _getField(y));
}
public int GetHashCode(T obj)
{
return EqualityComparer<C>.Default.GetHashCode(this._getField(obj));
}
}

实现

 class Program
{
static void Main(string[] args)
{ UserInfo info = new UserInfo();
List<UserInfo> list = new List<UserInfo>()
{
new UserInfo() { Id="", UserName=""},
new UserInfo() { Id="", UserName=""}
};
list.DistinctEx(x => x.Id).ToList().ForEach(item => { Console.WriteLine($"Id:{item.Id} UserName:{item.UserName}");
});
Console.ReadKey();
} class UserInfo
{
public string Id { get; set; }
public string UserName { get; set; }
}
}

 三、方法三

利用拉姆达表达式一句话即可

class Program
{
static void Main(string[] args)
{ List<UserInfo> list = new List<UserInfo>()
{
new UserInfo() { Id="", UserName=""},
new UserInfo() { Id="", UserName=""}
}; // 用拉姆达表达式一句话即可实现去重
var result = list.Where((x,i)=>list.FindIndex(y=>y.Id==x.Id)==i); result.ToList().ForEach(item=>
{
Console.WriteLine($"Id:{item.Id} UserName:{item.UserName}");
}); Console.ReadKey();
} class UserInfo
{
public string Id { get; set; }
public string UserName { get; set; }
} }

权责申明

作者:SportSky 出处: http://www.cnblogs.com/sportsky/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如果觉得还有帮助的话,可以点一下右下角的【推荐】,希望能够持续的为大家带来好的技术文章!想跟我一起进步么?那就【关注】我吧。

List对象去重碎碎念之神叨叨的更多相关文章

  1. 结对编程ending-我和洧洧的碎碎念

    应该是第一次和队友分工合作去完成一个项目,其中也经历了跳进不少坑又被拉回来的过程,总体来说这对于我俩也的确是值得纪念的一次经历. 我的碎碎念时间…… 对比个人项目和结对编程项目二者需求,前者重在面对不 ...

  2. Linux碎碎念

    在学习Linux过程中,有许多有用的小技巧.如果放在纸质的笔记本上,平时查阅会相当不方便.现在以一种“碎碎念”的方式,汇集整理在此,目前还不是很多,但随着学习.工作的深入,后续会陆陆续续添加更多的小技 ...

  3. 一些关于Linux入侵应急响应的碎碎念

    近半年做了很多应急响应项目,针对黑客入侵.但疲于没有时间来总结一些常用的东西,寄希望用这篇博文分享一些安全工程师在处理应急响应时常见的套路,因为方面众多可能有些杂碎. 个人认为入侵响应的核心无外乎四个 ...

  4. 一个谷粉和3年的Google Reader重度使用者的碎碎念

    2013-03-14 上午看到Andy Rubin辞去Android业务主管职务.由Chrome及应用高级副总裁继任的新闻,还在想这会给Android带来什么,中午刷微博的时候就挨了当头一棒:Goog ...

  5. Jerry的碎碎念:SAPUI5, Angular, React和Vue

    去年我去一个国内客户现场时,曾经和他们IT部门的一位架构师聊到关于在SAP平台上进行UI应用的二次开发时,UI框架是选用UI5还是Vue这个话题. 我们代表SAP, 向客户推荐使用UI5是基于以下六点 ...

  6. C语言 · 分分钟的碎碎念

    算法提高 分分钟的碎碎念   时间限制:1.0s   内存限制:256.0MB      问题描述 以前有个孩子,他分分钟都在碎碎念.不过,他的念头之间是有因果关系的.他会在本子里记录每一个念头,并用 ...

  7. 最近关于Qt学习的一点碎碎念

    最近关于Qt学习的一点碎碎念 一直在使用Qt,但是最近对Qt的认识更加多了一些.所以想把自己的一些想法记录下来. Qt最好的学习资料应该是官方的参考文档了.对Qt的每一个类都有非常详细的介绍.我做了一 ...

  8. Java实现 蓝桥杯VIP 算法提高 分分钟的碎碎念

    算法提高 分分钟的碎碎念 时间限制:1.0s 内存限制:256.0MB 问题描述 以前有个孩子,他分分钟都在碎碎念.不过,他的念头之间是有因果关系的.他会在本子里记录每一个念头,并用箭头画出这个念头的 ...

  9. Python 类对象去重

    注:set 对类对象去重,在于重写__eq__方法和__hash__方法,如果没有重写__hash__会导致People类对象不是可hash的 #!/usr/bin/env python # -*- ...

  10. java 集合 HashSet 实现随机双色球 HashSet addAll() 实现去重后合并 HashSet对象去重 复写 HashCode()方法和equals方法 ArrayList去重

    package com.swift.lianxi; import java.util.HashSet; import java.util.Random; /*训练知识点:HashSet 训练描述 双色 ...

随机推荐

  1. python线程同步原语--源码阅读

    前面两篇文章,写了python线程同步原语的基本应用.下面这篇文章主要是通过阅读源码来了解这几个类的内部原理和是怎么协同一起工作来实现python多线程的. 相关文章链接:python同步原语--线程 ...

  2. gitlab runner安装与使用

    今天来讲一下如何使用gitlab-runner 下载runner,根据自己对应服务器的型号自行选择下载: # Linux x86- sudo wget -O /usr/local/bin/gitlab ...

  3. mysql的数据类型和字段属性

    本文内容: 数据类型 数值类型 整数型 浮点型 定点型 日期时间类型 字符串类型 补充: 显示宽度与zerofll 记录长度 字段属性 空\不为空值:NULL.NOT NULL 主键:primary ...

  4. mysql练习----Using Null

    teacher id dept name phone mobile 101 1 Shrivell 2753 07986 555 1234 102 1 Throd 2754 07122 555 1920 ...

  5. SQL Server 提供的各种数据访问接口

    在创建SQL Server的链接服务器时,可以看到有如下几种访问接口,其中我们常用的只有1.3.4.6.其中4是安装Oracle客户端才会出现的接口,3.6是由于我电脑上装了2008R2和2012两个 ...

  6. HttpHandler实现网页图片防盗链

    using System; using System.Collections.Generic; using System.Linq; using System.Web; /// <summary ...

  7. 简单易懂的程序语言入门小册子(7):基于文本替换的解释器,加入continuation,重构解释器

    或许在加入continuation之前要先讲讲费这么大劲做这个有什么意义. 毕竟用不用continuation的计算结果都是一样的. 不过,这是一个兴趣使然的系列,学习这些知识应该完全出于好奇与好玩的 ...

  8. 常用的几条sql语句

    ### 常用的几条sql语句 选择:select * from table1 where 范围 插入:insert into table1(field1,field2) values(value1,v ...

  9. [Hive_8] Hive 设计优化

    0. 说明 在 Hive 中,数据库是一个文件夹,表也是文件夹 partition,是一个字段,是文件 前提:在 Hive 进行 where 子句查询的时候,会将条件语句和全表进行比对,搜索出所需的数 ...

  10. 详解PHP中的过滤器(Filter)

    PHP 过滤器用于验证和过滤来自非安全来源的数据,比如用户的输入. 什么是 PHP 过滤器? PHP 过滤器用于验证和过滤来自非安全来源的数据. 验证和过滤用户输入或自定义数据是任何 Web 应用程序 ...