分享

List之Union(),Intersect(),Except() 亦可以说是数学中的并集,交集,差集

 昵称10504424 2013-03-06

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(); } } } }
复制代码

 

以上运行的结果是:

以上的结果是重载了含有参数的IEqualityComparer<TSource> 方法,实现IEqualityComparer接口  对数据进行了重复过滤,如果不实现这个方法结果是

 var bingji = oneStudents.Union(twoStudents).ToList();//并(全)集 
 var jiaoji = oneStudents.Intersect(threeStudents).ToList();//交集 
var chaji = oneStudents.Except(threeStudents).ToList();//差集

但是对于List<T>的T是简单类型,如int  string  long 。。。。。是怎么样的呢?代码如下所示

复制代码
IList<int> firstNumbers = new List<int>() 
 
             { 
 
                 1,2,3,4,5,6,7 

             };

            IList<int> secondNumbers = new List<int>() 
 
             { 

                 8,9,10 

             };

            IList<int> thressNumbers = new List<int>() 
 
             { 

                 1,2,3 

             };


            var result1 = firstNumbers.Union(secondNumbers).ToList();
            var result2 = firstNumbers.Intersect(thressNumbers).ToList();
            var result3 = firstNumbers.Except(thressNumbers).ToList();
            Console.WriteLine("以下是并集的结果");
            result1.ForEach(x => Console.WriteLine(x));

            Console.WriteLine();
            Console.WriteLine("以下是交集的结果");
            result2.ForEach(x => Console.WriteLine(x));

Console.WriteLine(); Console.WriteLine(
"以下是差集的结果"); result3.ForEach(x => Console.WriteLine(x));
Console.WriteLine(
"以上是简单类型如:int string long。。。。。没有实现IEqualityComparer<T>接口");
复制代码

结果是:

 

说明一下 刚回来看了下书,是差集 不是补集、 已更改!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多