应用Lamb达表明式Distinct方法

前言

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

二、方法二

选拔Lamb达表达式Distinct方法,大家转到定义能够见见四个重载的Distinct方法,如图

图片 1

咱俩再转到定义看看IEqualityComparer接口里面终归是个什么东西,原本有三个主意

图片 2

此刻大家来达成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; }
        }
}

 三、方法三

使用Lamb达表明式一句话就可以

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 出处: 
本文版权归作者和博客园共有,招待转发,但未经笔者同意必需保留此段证明,且在篇章页面鲜明地点给出原来的书文连接,不然保留追究法律权利的职责。要是感到还应该有利于的话,能够点一下右下角的【推荐】,希望能够不断的为大家带来好的技能小说!想跟作者一块升高么?那就【关心】我吗。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website