List的并集和交集

关于List的交集和并集的东西,上代码

  class Program
    {
        static void Main(string[] args)
        {
            List<Fish> a = new List<Fish>();
            a.Add(new Fish() {Name="测试1",ID=0,Message="" });
            a.Add(new Fish() { Name = "测试2", ID = 1, Message = "" });
            a.Add(new Fish() { Name = "测试3", ID = 2, Message = "" });
            a.Add(new Fish() { Name = "测试4", ID = 3, Message = "" });
            List<Fish> b = new List<Fish>();
            b.Add(new Fish() { Name = "测试1", ID = 0, Message = "" });
            b.Add(new Fish() { Name = "测试3", ID = 5, Message = "" });
            b.Add(new Fish() { Name = "测试5", ID = 6, Message = "" });

            List<Fish> c = a.Union(b).ToList();             //List<Fish> c = a.Intersect(b).ToList();
            foreach (var item in c)
            {
                Console.WriteLine("Name:{0},ID:{1}", item.Name, item.ID);
            }
            Console.ReadLine();
        }

    }

    public class Fish
    {
        public string Name { get; set; }
        public int ID { get; set; }
        public string Message { get; set; }
    }

一个简单的测试类有三个属性,现在我想取a和b的并集,结果如下:

结果并不是我想要的,“测试1”这个结果应该显示一次就够了,而 List<Fish> c = a.Intersect(b).ToList();显示的结果更是空白,这是怎么回事儿? 来看一下Union的原型

        //
        // 摘要:
        //     通过使用默认的相等比较器生成两个序列的并集。
        //
        // 参数:
        //   first:
        //     一个 System.Collections.Generic.IEnumerable<T>,它的非重复元素构成联合的第一个集。
        //
        //   second:
        //     一个 System.Collections.Generic.IEnumerable<T>,它的非重复元素构成联合的第二个集。
        //
        // 类型参数:
        //   TSource:
        //     输入序列中的元素的类型。
        //
        // 返回结果:
        //     一个 System.Collections.Generic.IEnumerable<T>,包含两个输入序列中的元素(重复元素除外)。
        //
        // 异常:
        //   System.ArgumentNullException:
        //     first 或 second 为 null。
        public static IEnumerable<TSource> Union<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second);
        //
        // 摘要:
        //     通过使用指定的 System.Collections.Generic.IEqualityComparer<T> 生成两个序列的并集。
        //
        // 参数:
        //   first:
        //     一个 System.Collections.Generic.IEnumerable<T>,它的非重复元素构成联合的第一个集。
        //
        //   second:
        //     一个 System.Collections.Generic.IEnumerable<T>,它的非重复元素构成联合的第二个集。
        //
        //   comparer:
        //     用于对值进行比较的 System.Collections.Generic.IEqualityComparer<T>。
        //
        // 类型参数:
        //   TSource:
        //     输入序列中的元素的类型。
        //
        // 返回结果:
        //     一个 System.Collections.Generic.IEnumerable<T>,包含两个输入序列中的元素(重复元素除外)。
        //
        // 异常:
        //   System.ArgumentNullException:
        //     first 或 second 为 null。
        public static IEnumerable<TSource> Union<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second, IEqualityComparer<TSource> comparer);

还有一个重载函数,还有一个比较器 那咱们就写一个比较器呗

    public class FishComPare : IEqualityComparer<Fish>
    {

        public bool Equals(Fish x, Fish y)
        {
            return x.Name == y.Name && x.ID==y.ID;
        }

        public int GetHashCode(Fish obj)
        {
            return obj.Name.GetHashCode();
        }
    }

然后全部代码

   class Program
    {
        static void Main(string[] args)
        {
            List<Fish> a = new List<Fish>();
            a.Add(new Fish() { Name = "测试1", ID = 0, Message = "" });
            a.Add(new Fish() { Name = "测试2", ID = 1, Message = "" });
            a.Add(new Fish() { Name = "测试3", ID = 2, Message = "" });
            a.Add(new Fish() { Name = "测试4", ID = 3, Message = "" });
            List<Fish> b = new List<Fish>();
            b.Add(new Fish() { Name = "测试1", ID = 0, Message = "" });
            b.Add(new Fish() { Name = "测试3", ID = 5, Message = "" });
            b.Add(new Fish() { Name = "测试5", ID = 6, Message = "" });

              List<Fish> c = a.Union(b,new FishComPare()).ToList();
              //List<Fish> c = a.Intersect(b,,new FishComPare()).ToList();
            foreach (var item in c)
            {
                Console.WriteLine("Name:{0},ID:{1}", item.Name, item.ID);
            }
            Console.ReadLine();
        }

    }

    public class Fish
    {
        public string Name { get; set; }
        public int ID { get; set; }
        public string Message { get; set; }
    }

    public class FishComPare : IEqualityComparer<Fish>
    {

        public bool Equals(Fish x, Fish y)
        {
            return x.Name == y.Name && x.ID==y.ID;
        }

        public int GetHashCode(Fish obj)
        {
            return obj.Name.GetHashCode();
        }
    }
时间: 2024-10-25 21:07:54

List的并集和交集的相关文章

linux ---用uniq实现文件的并集和交集

1. 取出两个文件的并集(重复的行只保留一份) 2. 取出两个文件的交集(只留下同时存在于两个文件中的文件) 3. 删除交集,留下其他的行 1. cat file1 file2 | sort | uniq 2. cat file1 file2 | sort | uniq -d 3. cat file1 file2 | sort | uniq -u – c 显示输出中,在每行行首加上本行在文件中出现的次数.它可取代- u和- d选项. – d 只显示重复行. – u 只显示文件中不重复的各行. –

求链表的并集和交集

给定2个链表,求这2个链表的并集(链表)和交集(链表).不要求并集(链表)和交集(链表)中的元素有序. 如,输入: List1: 10->15->4->20 List2: 8->4->2->10 输出: 交集(链表):4->10 并集(链表):2->8->20->4->15->10 方法一(简单.直观的方法): 下面是得到2个链表的并集和交集的简单算法. InterSection(list1,list2): 初始化结果链表为空,遍历链

JavaScript中的正则表达式(终结篇)

JavaScript中的正则表达式(终结篇) 在之前的几篇文章中,我们了解了正则表达式的基本语法,但那些语法不是针对于某一个特定语言的.这篇博文我们将通过下面几个部分来了解正则表达式在JavaScript中的使用: JavaScript对正则表达式的支持程度 支持正则表达式的RegExp类型 RegExp的实例属性 RegExp的实例方法 RegExp的构造函数属性 简单的应用 第一部分:JavaScript对正则表达式的支持程度 之前我介绍了正则表达式的基本语法,如果大家不是很了解可以先看下面

shell脚本小实例

本文收集了一堆的shell脚本技巧,我说过,我写博客主要是作一些学习笔记,方便自己查阅,所以,我会搞出这么一篇文章,也没有什么不可理解的.关于这些技巧的出处,诶,我也忘了,可能来自theunixschool. commandlinefu.酷勤网和igigo.net,当然了,也有部分是我自己的经验心得,管他呢,进了我的脑子就是我的了. 0. shell 调试 复制代码代码如下: sh -x somefile.sh 在somefile.sh 文件里加上set+x set-x1. 用 && ||

Python基础教程【读书笔记】 - 2016/7/31

希望通过博客园持续的更新,分享和记录Python基础知识到高级应用的点点滴滴! 第十波:第10章  充电时刻 Python语言的核心非常强大,同时还提供了更多值得一试的工具.Python的标准安装包括一组模块,称为标准库standard library.展示这些模块的工作方式,讨论如何分析它们,学习它们所提供的功能. [10.1] 模块 已经知道如何创建和执行自己的程序,也学会了怎么用import从外部模块获取函数并且为自己的程序使用.接下来看看怎么编写自己的模块. [10.1.1] 模块是程序

redis中文文档

phpredis是php的一个扩展,效率是相当高有链表排序功能,对创建内存级的模块业务关系 很有用;以下是redis官方提供的命令使用技巧: 下载地址如下: https://github.com/owlient/phpredis(支持redis 2.0.4) Redis::__construct构造函数$redis = new Redis(); connect, open 链接redis服务参数host: string,服务地址port: int,端口号timeout: float,链接时长 (

Python基础教程(第十章 自带电池)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5459376.html______ Created on Marlowes 现在已经介绍了Python语言的大部分基础知识.Python语言的核心非常强大,同时还提供了更多值得一试的工具.Python的标准安装中还包括一组模块,称为标准库(standard library).之前已经介绍了一些模块(例如math和cmath,其中包

转载:C# HashSet 用法

原文地址:http://www.cnblogs.com/xiaopin/archive/2011/01/08/1930540.html   感谢博主分享! NET 3.5在System.Collections.Generic命名空间中包含一个新的集合类:HashSet<T>.这个集合类包含不重复项的无序列表.这种集合称为“集(set)”.集是一个保留字,所以该类有另一个名称HashSet<T>.这个名称很容易理解,因为这个集合基于散列值,插入元素的操作非常快,不需要像List<

高程5.4 RegExp类型

ECMAScript通过RegExp类型来支持正则表达式. 使用下面类似Perl的语法,就可以创建一个正则表达式. var expression=/pattern/flags; 其中的模式(pattern)部分可以是任何简单的或复杂的正则表达式,可以包含字符类,限定符,分组,向前查找以及反向引用. 每个正则表达式都可带有一或多个标志(flags),用以标明正则表达式的行为. 正则表达式的匹配模式支持下面3个标志. g:表示全局(global)模式,即模式将被应用于所有字符串,而非在发现第一个匹配