List Except 操作,IEqualityComparer 使用

風靈使發表於2018-06-05

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.Threading;

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());

            });

            Console.ReadKey();
        }

    }

    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();
            }
        }
    }

}

https://msdn.microsoft.com/zh-cn/library/bb336390(v=vs.110).aspx

執行結果如圖:

這裡寫圖片描述

相關文章