• 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);
  • 相关阅读:
    《冒号课堂》目录 书名:冒号课堂——编程范式与OOP思想
    很好的WEB打印网页打印功能
    桌面搜索程序 Python
    面向对象保存爬虫数据 Python
    爬取微博热搜榜 李白之死 Python
    雪中悍刀行热播,来做一篇关于python的作业 爬虫与数据分析
    几个简单的例子 巩固Xpath语法 Python
    替换特殊字符 Python
    爬取酷狗榜单并可视化词云 Python
    Selenium尝试更改useragent 基于Python
  • 原文地址:https://www.cnblogs.com/lanpingwang/p/6608024.html
Copyright © 2020-2023  润新知