zoukankan      html  css  js  c++  java
  • lambda表达式的distinct去重

    天真的我最开始以为可以写成list.distinct(x=>x.name);以为这样就可以按照name去重了,结果是不行的。这里记录下正确的用法。

    1.这里是针对int集合  可以满足

    #region 对数字集合的去重
    //List<int> list = new List<int> { 1,1,2,3,4,5,5,6,6,7,7,7 };
    //foreach (var item in list)
    //{
    // Console.Write(item+" ");
    //}
    //var res = list.Distinct();
    //Console.WriteLine();
    //Console.WriteLine("********************************");
    //foreach (var item in res)
    //{
    // Console.Write(item+" ");
    //}
    //可以看到 对于数字来说 distinct可以实现去重
    #endregion

     2.对对象集合使用 失败

    #region 对非数字类型去重失败的方法
    //List<Student> list = new List<Student>
    //{
    // new Student{name="张三",age=20},
    // new Student{name="张三",age=20},
    // new Student{name="李四",age=20},
    // new Student{name="李四",age=20},
    // new Student{name="王五",age=20},
    // new Student{name="赵六",age=20},
    // new Student{name="陈启",age=20},
    // new Student{name="陈启",age=20},
    //};
    //foreach (var item in list)
    //{
    // Console.Write(item.name + " ");
    //}
    //var res = list.Distinct();
    //Console.WriteLine();
    //Console.WriteLine("********************************");
    //foreach (var item in res)
    //{
    // Console.Write(item.name + " ");
    //}
    //运行这段代码 可以看到去重失败了 下面来看正确的做法
    #endregion

     3.这才是正确的方法

    class Program
    {
    static void Main(string[] args)
    {
    #region 对非数字类型去重正确
    List<Student> list2 = new List<Student>
    {
    new Student{name="张三",age=20},
    new Student{name="张三",age=20},
    new Student{name="李四",age=20},
    new Student{name="李四",age=20},
    new Student{name="王五",age=20},
    new Student{name="赵六",age=20},
    new Student{name="陈启",age=20},
    new Student{name="陈启",age=20},
    };
    foreach (var item in list2)
    {
    Console.Write(item.name + " ");
    }
    var res2 = list2.Distinct(new userCompare());
    Console.WriteLine();
    Console.WriteLine("********************************");
    foreach (var item in res2)
    {
    Console.Write(item.name + " ");
    }
    //声明一个类 实现IEqualityComparer接口
    //实现方法bool Equals(T x, T y);
    //int GetHashCode(T obj);
    //然后再内部写上比较的字段和属性 比较才能成功 才能去重
    #endregion
    Console.ReadLine();
    }
    }


    public class Student
    {
    public int age { get; set; }
    public string name { get; set; }
    }


    public class userCompare : IEqualityComparer<Student>
    {

    #region IEqualityComparer<user> Members

    public bool Equals(Student x, Student y)
    {

    return x.name.Equals(y.name);

    }

    public int GetHashCode(Student obj)
    {

    return obj.name.GetHashCode();

    }

    #endregion

    }

  • 相关阅读:
    数据库范式那些事[转]
    C# 之值类型与引用类型参数[基础]
    C# 实体类生成工具
    《浅谈线程池》笔记
    提高网站性能之 —— 减少图片HTTP 请求的方案
    SQL Server 2005 For XML[学习]
    关于数据类型导致的精确计算
    SQL Server 数据库实现之TSQL语句[备忘]
    C# 关键字ref 和out 的详细区别
    关于XML中的名称空间
  • 原文地址:https://www.cnblogs.com/yagamilight/p/12305538.html
Copyright © 2011-2022 走看看