zoukankan      html  css  js  c++  java
  • List对象去重碎碎念之神叨叨

    前言

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

    一、方法一

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

     class Program
        {
            static void Main(string[] args)
            {
                List<UserInfo> list = new List<UserInfo>()
                {
                    new UserInfo() {  Id="1", UserName="111"},
                    new UserInfo() {  Id="1", UserName="111"}
                };
    
                // 因为我们通常操作的是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="1", UserName="111"},
                    new UserInfo() {  Id="1", UserName="111"}
                };
    
                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="1", UserName="111"},
                    new UserInfo() {  Id="1", UserName="111"}
                };
                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="1", UserName="111"},
                    new UserInfo() {  Id="1", UserName="111"}
                };
    
                // 用拉姆达表达式一句话即可实现去重
                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/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如果觉得还有帮助的话,可以点一下右下角的【推荐】,希望能够持续的为大家带来好的技术文章!想跟我一起进步么?那就【关注】我吧。

  • 相关阅读:
    jQuery插件之jquery editable plugin点击编辑文字插件
    firefox与ie的javascript兼容性编程汇编【转载】
    css前端制作 经验总结
    非常棒的jqChart图表插件
    WPF Image Source设置文件路径后 在编辑状态下显示图片,运行时不显示
    WPF RadioButton 绑定枚举
    WPF MVVM实现数据增删改查逻辑全流程详细解析demo
    bigNumber.js的简单使用
    PHP程序的“Missing argument 3”的错误提示解决方法
    PHP判断0和空的方法
  • 原文地址:https://www.cnblogs.com/sportsky/p/9516339.html
Copyright © 2011-2022 走看看