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);
  • 相关阅读:
    Maven 在pom.xml的build中配置resources,来防止我们资源导出失败的问题
    JavaWeb
    MySQL
    JavaScript
    Caused by: org.apache.ibatis.exceptions.PersistenceExceptiong 更新IDEA后报错
    Loading class `com.mysql.jdbc.Driver‘. This is deprecated.警告处理,jdbc更新处
    mybatis+oracle添加数据时如果数据存在就更新,如果不存在就插入
    条件查询器Wrapper
    查询和删除
    时间和悲观锁
  • 原文地址:https://www.cnblogs.com/lanpingwang/p/6608024.html
Copyright © 2011-2022 走看看