博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.net List的并集和交集
阅读量:6462 次
发布时间:2019-06-23

本文共 4690 字,大约阅读时间需要 15 分钟。

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

class Program    {        static void Main(string[] args)        {            List
a = new List
(); 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
b = new List
(); 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
c = a.Union(b).ToList();   //List
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
,它的非重复元素构成联合的第一个集。 // // second: // 一个 System.Collections.Generic.IEnumerable
,它的非重复元素构成联合的第二个集。 // // 类型参数: // TSource: // 输入序列中的元素的类型。 // // 返回结果: // 一个 System.Collections.Generic.IEnumerable
,包含两个输入序列中的元素(重复元素除外)。 // // 异常: // System.ArgumentNullException: // first 或 second 为 null。 public static IEnumerable
Union
(this IEnumerable
first, IEnumerable
second); // // 摘要: // 通过使用指定的 System.Collections.Generic.IEqualityComparer
生成两个序列的并集。 // // 参数: // first: // 一个 System.Collections.Generic.IEnumerable
,它的非重复元素构成联合的第一个集。 // // second: // 一个 System.Collections.Generic.IEnumerable
,它的非重复元素构成联合的第二个集。 // // comparer: // 用于对值进行比较的 System.Collections.Generic.IEqualityComparer
。 // // 类型参数: // TSource: // 输入序列中的元素的类型。 // // 返回结果: // 一个 System.Collections.Generic.IEnumerable
,包含两个输入序列中的元素(重复元素除外)。 // // 异常: // System.ArgumentNullException: // first 或 second 为 null。 public static IEnumerable
Union
(this IEnumerable
first, IEnumerable
second, IEqualityComparer
comparer);

还有一个重载函数,还有一个比较器

那咱们就写一个比较器呗

public class FishComPare : IEqualityComparer
{ 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
a = new List
(); 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
b = new List
(); 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
c = a.Union(b,new FishComPare()).ToList(); //List
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
{ 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(); } }

运行

得到我们想要的结果了,同理,交集也是同样方法

如果我想以Name来比较怎么办,也就是说 我想把”测试3“相同的当一样的,不管ID是否相同,那也好办,我么只需要

public class FishComPare : IEqualityComparer
{ public bool Equals(Fish x, Fish y) { return x.Name == y.Name; } public int GetHashCode(Fish obj) { return obj.Name.GetHashCode(); } }

然后我们继续求并集,得到如下结果

也就是说 我们可以以一个类中的一个元素来当做比较对象,这种方式要省了很大力气,虽然遍历循环也能实现,但是有方便的何不拿来直接用呢

转载于:https://www.cnblogs.com/fish124423/archive/2012/07/20/2601498.html

你可能感兴趣的文章
C#反射---属性
查看>>
服务器常用的状态码及其对应的含义如下
查看>>
完美字符串
查看>>
zoom和transform:scale的区别
查看>>
幸福框架:可扩展的、动态的、万能的 编号生成器
查看>>
黄聪:PHP 防护XSS,SQL,代码执行,文件包含等多种高危漏洞
查看>>
svn status 显示 ~xx
查看>>
常用HiveQL总结
查看>>
[转]使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(三)-- Logger
查看>>
POJ 3311 Hie with the Pie(状压DP + Floyd)
查看>>
HDU 1402 A * B Problem Plus FFT
查看>>
[CareerCup] 17.3 Factorial Trailing Zeros 求阶乘末尾零的个数
查看>>
Security updates and resources
查看>>
深入理解JavaScript系列(25):设计模式之单例模式
查看>>
DNS为什么通常都会设置为14.114.114.114
查看>>
给定一个序列,判断该序列是否为二叉树查找树的后序遍历序列
查看>>
Sqoop架构(四)
查看>>
golang copy函数
查看>>
《你有多少问题要请示》精华集粹
查看>>
深度 | 机器学习敲门砖:任何人都能看懂的TensorFlow介绍【转】
查看>>