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);
  • 相关阅读:
    SpringMVC上传文件的三种方式(转载)
    几种流行Webservice框架性能对比(转载)
    @QueryParam和@PathParam使用方法比较
    MyEclipse开发Rest服务入门
    WebService SOAP、Restful和HTTP(post/get)请求区别
    Java WebService入门实例
    WebService 与 Socket 区别
    Double 数据保留两位小数二:直接截取小数后面两位,不进行四舍五入
    SVN 常识
    Android 友盟分享躺过的几个坑,大坑,坑爹啊
  • 原文地址:https://www.cnblogs.com/lanpingwang/p/6608024.html
Copyright © 2011-2022 走看看