zoukankan      html  css  js  c++  java
  • LINQ 学习路程 -- 查询操作 Distinct Except Intersect Union

    Set OperatorsUsage
    Distinct 去掉集合的重复项
    Except 返回两个集合的不同,第一个集合的元素不能出现在第二个集合中
    Intersect 返回两个集合的交集,即元素同时出现在两个集合中
    Union Returns unique elements from two sequences, which means unique elements that appear in either of the two sequences.



    IList<string> strList = new List<string>(){ "One", "Two", "Three", "Two", "Three" };
    
    IList<int> intList = new List<int>(){ 1, 2, 3, 2, 4, 4, 3, 5 };
    
    var distinctList1 = strList.Distinct();
    
    foreach(var str in distinctList1)
        Console.WriteLine(str);
    
    var distinctList2 = intList.Distinct();
    
    foreach(var i in distinctList2)
        Console.WriteLine(i);

     如果要去掉复杂类型的重复项,需要实现IEqualityComparer接口

    public class Student 
    {
        public int StudentID { get; set; }
        public string StudentName { get; set; }
        public int Age { get; set; }
    }
    
    class StudentComparer : IEqualityComparer<Student>
    {
        public bool Equals(Student x, Student y)
        {
            if (x.StudentID == y.StudentID 
                    && x.StudentName.ToLower() == y.StudentName.ToLower())
                return true;
    
            return false;
        }
    
        public int GetHashCode(Student obj)
        {
            return obj.StudentID.GetHashCode();
        }
    }
    IList<Student> studentList = new List<Student>() { 
            new Student() { StudentID = 1, StudentName = "John", Age = 18 } ,
            new Student() { StudentID = 2, StudentName = "Steve",  Age = 15 } ,
            new Student() { StudentID = 3, StudentName = "Bill",  Age = 25 } ,
            new Student() { StudentID = 3, StudentName = "Bill",  Age = 25 } ,
            new Student() { StudentID = 3, StudentName = "Bill",  Age = 25 } ,
            new Student() { StudentID = 3, StudentName = "Bill",  Age = 25 } ,
            new Student() { StudentID = 5, StudentName = "Ron" , Age = 19 } 
        };
    
    
    var distinctStudents = studentList.Distinct(new StudentComparer()); 
    
    foreach(Student std in distinctStudents)

     Except

     第一个集合的元素不在第二个集合中出现,返回新的集合

    IList<string> strList1 = new List<string>(){"One", "Two", "Three", "Four", "Five" };
    IList<string> strList2 = new List<string>(){"Four", "Five", "Six", "Seven", "Eight"};
    
    var result = strList1.Except(strList2);
    
    foreach(string str in result)
            Console.WriteLine(str);
    public class Student 
    {
        public int StudentID { get; set; }
        public string StudentName { get; set; }
        public int Age { get; set; }
    }
    
    class StudentComparer : IEqualityComparer<Student>
    {
        public bool Equals(Student x, Student y)
        {
            if (x.StudentID == y.StudentID && x.StudentName.ToLower() == y.StudentName.ToLower())
                return true;
    
            return false;
        }
    
        public int GetHashCode(Student obj)
        {
            return obj.StudentID.GetHashCode();
        }
    }
    public class Student 
    {
        public int StudentID { get; set; }
        public string StudentName { get; set; }
        public int Age { get; set; }
    }
    
    class StudentComparer : IEqualityComparer<Student>
    {
        public bool Equals(Student x, Student y)
        {
            if (x.StudentID == y.StudentID && x.StudentName.ToLower() == y.StudentName.ToLower())
                return true;
    
            return false;
        }
    
        public int GetHashCode(Student obj)
        {
            return obj.StudentID.GetHashCode();
        }
    }

    Intersect

    返回两个集合的交集

    IList<string> strList1 = new List<string>() { "One", "Two", "Three", "Four", "Five" };
    IList<string> strList2 = new List<string>() { "Four", "Five", "Six", "Seven", "Eight"};
    
    var result = strList1.Intersect(strList2);
    
    foreach(string str in result)
            Console.WriteLine(str);

    复杂类型的交集需要实现IEqualityComparer<T>接口

    public class Student 
    {
        public int StudentID { get; set; }
        public string StudentName { get; set; }
        public int Age { get; set; }
    }
    
    class StudentComparer : IEqualityComparer<Student>
    {
        public bool Equals(Student x, Student y)
        {
            if (x.StudentID == y.StudentID && 
                            x.StudentName.ToLower() == y.StudentName.ToLower())
                return true;
    
            return false;
        }
    
        public int GetHashCode(Student obj)
        {
            return obj.StudentID.GetHashCode();
        }
    }
    IList<Student> studentList1 = new List<Student>() { 
            new Student() { StudentID = 1, StudentName = "John", Age = 18 } ,
            new Student() { StudentID = 2, StudentName = "Steve",  Age = 15 } ,
            new Student() { StudentID = 3, StudentName = "Bill",  Age = 25 } ,
            new Student() { StudentID = 5, StudentName = "Ron" , Age = 19 } 
        };
    
    IList<Student> studentList2 = new List<Student>() { 
            new Student() { StudentID = 3, StudentName = "Bill",  Age = 25 } ,
            new Student() { StudentID = 5, StudentName = "Ron" , Age = 19 } 
        };
    
    var resultedCol = studentList1.Intersect(studentList2, new StudentComparer()); 
    
    foreach(Student std in resultedCol)
        Console.WriteLine(std.StudentName);

    Union

    两个集合的并集

    IList<string> strList1 = new List<string>() { "One", "Two", "three", "Four" };
    IList<string> strList2 = new List<string>() { "Two", "THREE", "Four", "Five" };
    
    var result = strList1.Union(strList2);
    
    foreach(string str in result)
            Console.WriteLine(str);

    复杂类型的并集需要实现IEqualityComparer<T>接口

    public class Student 
    {
        public int StudentID { get; set; }
        public string StudentName { get; set; }
        public int Age { get; set; }
    }
    
    class StudentComparer : IEqualityComparer<Student>
    {
        public bool Equals(Student x, Student y)
        {
            if (x.StudentID == y.StudentID && x.StudentName.ToLower() == y.StudentName.ToLower())
                return true;
    
            return false;
        }
    
        public int GetHashCode(Student obj)
        {
            return obj.StudentID.GetHashCode();
        }
    }
    IList<Student> studentList1 = new List<Student>() { 
            new Student() { StudentID = 1, StudentName = "John", Age = 18 } ,
            new Student() { StudentID = 2, StudentName = "Steve",  Age = 15 } ,
            new Student() { StudentID = 3, StudentName = "Bill",  Age = 25 } ,
            new Student() { StudentID = 5, StudentName = "Ron" , Age = 19 } 
        };
    
    IList<Student> studentList2 = new List<Student>() { 
            new Student() { StudentID = 3, StudentName = "Bill",  Age = 25 } ,
            new Student() { StudentID = 5, StudentName = "Ron" , Age = 19 } 
        };
    
    var resultedCol = studentList1.Union(studentList2, new StudentComparer()); 
    
    foreach(Student std in resultedCol)
        Console.WriteLine(std.StudentName);
  • 相关阅读:
    2.8Java专项测试复盘
    我的第一篇博客
    VS2010调试汇编
    socket学习
    DLL 共享数据学习
    PE学习
    char*,const char*和string的相互转换 + 三种版本字符串
    unresolved external symbol “symbol”(不确定的外部“符号”)。
    深入理解const char*p,char const*p,char *const p,const char **p,char const**p,char *const*p,char**const p
    volatile学习
  • 原文地址:https://www.cnblogs.com/lanpingwang/p/6608024.html
Copyright © 2011-2022 走看看