• List Except 操作,IEqualityComparer 使用


    1.此接口用于对集合 的自定义相等比较算法的实现。包含2个方法:

         Equals(T,T): 确定指定的对象是否相等。 T 为要比较的对象类型;

         GetHashCode(T) :返回指定对象的哈希代码。如果两个对象的Equal 比较结果相等,则他们hashCode返回的对象也必须返回同一个值

    2. 官方建议继承 EqualityComparer<T> 而不是实现 IEqualityComparer<T>

    3.

    Union()

    这个方法将会Union(并集)两个序列(集合)连接成一个新列表(集合)

    public static IEnumerable<TSource> Union<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second)

    public static IEnumerable<TSource> Union<TSource>(this IEnumerable<TSource> first,IEnumerable<TSource> second, IEqualityComparer<TSource> comparer)

     

     

    Intersect ()

     

    它将产生两个序列的交集.

    方法定义是: 

    public static IEnumerable<TSource> Intersect<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second) 
    
    public static IEnumerable<TSource> Intersect<TSource>(this IEnumerable<TSource> first, Enumerable<TSource> second,IEqualityComparer<TSource> comparer) 

     

     

    Except ()

     

    它是从一个集合中删除存在另一个集合中的项.两个序列产生的集合差. 英文意思是:除此之外

     

    方法定义是: 

     

    public static IEnumerable<TSource> Except<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second) 
    public static IEnumerable<TSource> Except<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second, IEqualityComparer<TSource> comparer)

     

    实例代码分别如下:

     

     

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data; 
    
    
    namespace test
    {
        class Program
        {
            static void Main(string[] args)
            {
                IList<Student> oneStudents = new List<Student>();
                oneStudents.Add(new Student(1,false,"小新1","徐汇"));
                oneStudents.Add(new Student(2,false,"小新2","闵行"));
                oneStudents.Add(new Student(3, false, "小新3", "嘉定"));
                oneStudents.Add(new Student(4, false, "小新4", "闸北"));
    
                IList<Student> twoStudents = new List<Student>();
                twoStudents.Add(new Student(5, false, "小新5", "贵州"));
                twoStudents.Add(new Student(6, false, "小新6", "湖北"));
                twoStudents.Add(new Student(7, false, "小新7", "山东"));
                twoStudents.Add(new Student(8, false, "小新8", "西藏"));
    
                IList<Student> threeStudents = new List<Student>();
                threeStudents.Add(new Student(1, false, "小新1", "徐汇"));
                threeStudents.Add(new Student(2, false, "小新2", "闵行"));
                var bingji = oneStudents.Union(twoStudents, new StudentListEquality()).ToList();//并(全)集 
                  var jiaoji = oneStudents.Intersect(threeStudents, new StudentListEquality()).ToList();//交集 
                  var chaji = oneStudents.Except(threeStudents, new StudentListEquality()).ToList();//差集
    
                  Console.WriteLine();
                Console.WriteLine("以下是并集的结果");            
                bingji.ForEach(x =>
                {
                    Console.WriteLine(x.StudentId.ToString() + "    " + x.Sex.ToString() + "   " + x.Name.ToString()+" "+x.Address.ToString());
         
                });
                Console.WriteLine();
                Console.WriteLine("以下是交集的结果");           
                jiaoji.ForEach(x =>
                {
                    Console.WriteLine(x.StudentId.ToString() + "    " + x.Sex.ToString() + "   " + x.Name.ToString() + " " + x.Address.ToString());
    
                });
    
                Console.WriteLine();
                Console.WriteLine("以下是差集的结果");            
                chaji.ForEach(x =>
                {
                    Console.WriteLine(x.StudentId.ToString() + "    " + x.Sex.ToString() + "   " + x.Name.ToString() + " " + x.Address.ToString());
    
                });
            }
    
        }
    
    
    
    
    
        public class Student
        {
            public Student(int studentId, bool sex, String name, String address)
            {
                this.StudentId = studentId;
                this.Sex = sex;
                this.Name = name;
                this.Address = address;
            }
            public int StudentId { get; set; }
            public bool Sex { get; set; }
            public String Name { get; set; }
            public String Address { get; set; }
           
        }
        public class StudentListEquality : IEqualityComparer<Student>
        {
            public bool Equals(Student x, Student y)
            {
                return x.StudentId == y.StudentId;
            }
    
            public int GetHashCode(Student obj)
            {
                if (obj == null)
                {
                    return 0;
                }
                else
                {
                    return obj.ToString().GetHashCode();
                }
            }
        }
    
    
    
    }

     

     

  • 相关阅读:
    windows内核函数1
    驱动程序中获取当前进程的进程名的方法
    vs2008+WDK7600驱动开发环境配置
    P2P之UDP穿透NAT的原理与实现之我见
    设计模式-工厂模式
    C++解析ini文件_转载
    利用sort和lambda表达式对vector中的pair进行排序
    C++ 获取目录下具有指定后缀名的所有文件名_windows
    深度学习提取得到的特征值进行特征值相似度比对
    C/C++从路径字符串中获取文件名
  • 原文地址:https://www.cnblogs.com/benhua/p/6805192.html
Copyright © 2020-2023  润新知