List Except 操作,IEqualityComparer 使用

Posted bany

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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();
            }
        }
    }



}

 


 

 

以上是关于List Except 操作,IEqualityComparer 使用的主要内容,如果未能解决你的问题,请参考以下文章

XSLT - 使用 except 消除后代节点

C# 两个集合比较差值 Linq的Except的用法

Python Try Except

SQL实战新手入门:EXCEPT和MINUS操作符

SQL SERVER: 合并相关操作(Union,Except,Intersect) - 转载

大数据量情况下高效比较两个list