关于Union的两种情况

一、简单值类型或者string类型处理方式(集合需要实现IEnumerable接口)

  1. #region int类型
  2.  
  3. List<int> ints1 = new List<int> { , , , , , };
  4. List<int> ints2 = new List<int> { , , , , , };
  5. IEnumerable<int> intsResult = ints1.Union(ints2).OrderBy(c => c);
  6. //结果为0, 1, 2, 3, 4, 5, 6, 7, 8, 9
  7.  
  8. #endregion
  9.  
  10. #region string类型
  11.  
  12. List<string> str1 = new List<string> { "str1", "str2", "str3", "str4", "str5", "str6" };
  13. List<string> str2 = new List<string> { "str5", "str6", "str7", "str8", "str9", "str0" };
  14. IEnumerable<string> strResult = str1.Union(str2).OrderBy(c => c);
  15. //结果为str0, str1, str2, str3, str4, str5, str6, str7, str8, str9
  16.  
  17. #endregion

二、引用类型(自定义类类型),这时我们就需要定义自己的比较方式,否则编译器会以默认的比较对象的应用类型,有时并不能得到我们需要的结果。

1:首先需要定义比较类型,需要实现IEqualityComparer或者其返修接口IEqualityComparer<T>

a:比如我们有一个自定义类,我们要建立对它的Union操作,该类型定义如下:

  1. public class User
  2. {
  3. public string ID { get; set; }
  4. public string Name { get; set; }
  5. public string Grade { get; set; }
  6.  
  7. public int CompareTo(User stu)
  8. {
  9. if (stu == null)
  10. throw new ArgumentNullException("stu");
  11. return Grade.CompareTo(stu.Grade);
  12. }
  13. }

b:自定义比较类型如下:

  1. /// <summary>
  2. /// 自定义比较类
  3. /// </summary>
  4. public class EntityComparer : IEqualityComparer<User>
  5. {
  6. public bool Equals(User a, User b)
  7. {
  8. if (Object.ReferenceEquals(a, b)) return true;
  9. if (Object.ReferenceEquals(a, null) || Object.ReferenceEquals(b, null))
  10. return false;
  11.  
  12. return a.ID == b.ID && a.Name == b.Name && a.Grade == b.Grade;
  13. }
  14.  
  15. public int GetHashCode(User a)
  16. {
  17. if (Object.ReferenceEquals(a, null)) return ;
  18. int hashName = a.Name == null ? : a.Name.GetHashCode();
  19. int hashCode = a.Grade.GetHashCode();
  20.  
  21. return hashName ^ hashCode;
  22. }
  23. }

2:建立对User对象集合的Union关系(应用我们自定义的EntityComparer):

  1. #region 对象集合
  2.  
  3. IEnumerable<User> list1 = new List<User> { new User { ID = "", Name = "张三", Grade = "高三" }, new User { ID = "", Name = "王二", Grade = "高三" } };
  4. IEnumerable<User> list2 = new List<User> { new User { ID = "", Name = "张三", Grade = "高三" }, new User { ID = "", Name = "李四", Grade = "高二" } };
  5.  
  6. IEqualityComparer<User> ec = new EntityComparer();
  7.  
  8. //1:直接应用Union的重装方法
  9. //IEnumerable<TSource> Union<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second, IEqualityComparer<TSource> comparer)
  10. IEnumerable<User> users1 = list1.Union(list2,ec).OrderBy(c=>c.ID);
  11.  
  12. //IEnumerable<TSource> Distinct<TSource>(this IEnumerable<TSource> source, IEqualityComparer<TSource> comparer)
  13. //2:使用Concat,然后再使用distinct方法
  14. IEnumerable<User> users2 = list1.Concat(list2).Distinct(ec).OrderBy(c => c.ID);
  15.  
  16. foreach (User item in users2)
  17. Console.WriteLine("ID:{0,-7}Name:{1,-5}Grade:{2}", item.ID, item.Name, item.Grade);
  18.  
  19. /*结果
  20. ID = "0002", Name = "王二", Grade = "高三"
  21. ID = "0003", Name = "张三", Grade = "高三"
  22. ID = "0004", Name = "李四", Grade = "高二"
  23. */

Linq 集合处理(Union)的更多相关文章

  1. Linq集合操作之Intersect,Except,Union源码分析

    Linq集合操作之Intersect,Except,Union源码分析 linq的集合运算 常见的集合运算有哪些? 这三个扩展方法在我们实际使用中用的还是非常多的,而且这里还涉及到了“复杂度” 无算法 ...

  2. Linq 集合操作

    Linq 集合操作 演示代码 两个对象一个是Person,一个Address, AddressId是外键, public class Person { public string ID { get; ...

  3. linq集合内部赋值

    linq集合内部赋值 比如将一个列的值,赋值给另一列 有三种方法: 1. e.Result.ToList().ForEach(n => n.IsIntermediarybool = SetIsI ...

  4. Oracle SQL Lesson (8) - 使用集合操作符(Union,Intersect,Minus)

    集合操作符UNION/UNION ALLINTERSECTMINUS Union All不排序,不去重,其余均升序且去重.create table e1 as select * from emp wh ...

  5. 集合运算—union(并集)、intersect(交集)和except(差集)

    一.集合运算的基本格式是: 集合查询1 <集合运算> 集合查询2 [order by ...] 二.集合运算符是对两个集合操作的,两个集合必须具有相同的列数,列具有相同的数据类型(至少能隐 ...

  6. Python杂谈: 集合中union和update的区别(Python3.x)

    集合中union和update方法都是将多个可迭代的对象合并,但是返回的结果和对初始对象的影响却不一样 # union() 方法 - a.union(b) 将集合a和集合b取并集,并将并集作为一个新的 ...

  7. 集合操作符 Union / Union All / Intersect / Minus

    集合操作符 Union / UnionAll / Intersect / Minus -- 生成测试数据 create table dept_01 as select * from dept wher ...

  8. Linq 集合操作符 Except,Intersect,Union

    IList<string> s1 = new List<string>() { "One", "Two", "Three&qu ...

  9. C#Linq中的Union All/Union/Intersect和Top/Bottom和Paging和SqlMethods,skip,take,takewhile,skipwhile,编译查询等

    我们继续讲解LINQ to SQL语句,这篇我们来讨论Union All/Union/Intersect操作和Top/Bottom操作和Paging操作和SqlMethods操作 . Union Al ...

随机推荐

  1. C# 将DateTime.Now.DayOfWeek的值转为中文星期

    1.  如果常规使用DateTime.Now.DayOfWeek则得到是英文,如果加ToString后再加上相关参数(“G”.“g”.“X”.“x”.“F”.“f”.“D”或“d”),则还会有所变化. ...

  2. Eclipse和MyEclipse的区别 分类: 编程工具 2015-07-18 11:12 23人阅读 评论(0) 收藏

    今天,在一个Q群里有人问Eclipse和MyEclipse的区别.虽然对于知道的人来说答案很简单,但是对于不知道的人来说就很难,很多问题也都是这样的,会者不难,难者不会. 其实,网上搜搜答案就挺多的, ...

  3. RNA_seq GATK 最佳实践

    GATK处理DNA 水平的snp 经验比较成熟,而RNA 水平较少,所以可能会存在错误 目前的流程兼顾了假阳性(不是真的snp位点)和假阴性(该位点是snp,却没有检测到):后续会不断改善     G ...

  4. dubbo学习过程、使用经验分享及实现原理简单介绍

    一.前言 部门去年年中开始各种改造,第一步是模块服务化,这边初选dubbo试用在一些非重要模块上,慢慢引入到一些稍微重要的功能上,半年时间,学习过程及线上使用遇到的些问题在此总结下. 整理这篇文章差不 ...

  5. 让小区运营再智能一点,EasyRadius正式向WayOs用户提供到期弹出式提示充值页面

    其实一直没向用户提供到期弹出式页面,主要是给VIP群的用户一点优越感,随着这次EasyRadius的更新,海哥就免费向普通easyRadius用户提供这两个模板下载. 有些人会问,什么样的模板.有什么 ...

  6. idea出现插件突然失灵解决方案

    File -> Settings  -> Plgins  把失效的插件重新去掉打钩并重新打钩即可

  7. springboot-mybatis-plus基本项目框架

    此仅仅为web最基本框架, 统一异常管理.接口统一日志管理. 项目结构: 注: 修改为如下图,作用是sql打印输出. 源码下载:https://files.cnblogs.com/files/007s ...

  8. 软件设计模式之适配器模式(JAVA)

    什么是适配器模式? 在计算机编程中,适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的.适配器能将因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存 ...

  9. Java初学者必学的JSTL

    所谓JSTL就是标签库  JSP Standard Tag Library,如果做为java初学者你看不懂那些$符号的话,就有必要来了解一下JSTL,如果你看到满眼的<%}%>(Scrip ...

  10. mac osx voice over的使用

    mac下的filezilla是一个很奇葩的应用,奇葩在哪?有一次我不知道怎么操作的,把filezilla搬到到了窗体顶部,结果被mac的菜单栏挡住了标题栏,然后再也无法移动窗体了,以下是我为了移动它做 ...