关于Union的两种情况

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

        #region int类型

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

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

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

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

    public class User
{
public string ID { get; set; }
public string Name { get; set; }
public string Grade { get; set; } public int CompareTo(User stu)
{
if (stu == null)
throw new ArgumentNullException("stu");
return Grade.CompareTo(stu.Grade);
}
}

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

    /// <summary>
/// 自定义比较类
/// </summary>
public class EntityComparer : IEqualityComparer<User>
{
public bool Equals(User a, User b)
{
if (Object.ReferenceEquals(a, b)) return true;
if (Object.ReferenceEquals(a, null) || Object.ReferenceEquals(b, null))
return false; return a.ID == b.ID && a.Name == b.Name && a.Grade == b.Grade;
} public int GetHashCode(User a)
{
if (Object.ReferenceEquals(a, null)) return ;
int hashName = a.Name == null ? : a.Name.GetHashCode();
int hashCode = a.Grade.GetHashCode(); return hashName ^ hashCode;
}
}

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

            #region 对象集合

            IEnumerable<User> list1 = new List<User> { new User { ID = "", Name = "张三", Grade = "高三" }, new User { ID = "", Name = "王二", Grade = "高三" } };
IEnumerable<User> list2 = new List<User> { new User { ID = "", Name = "张三", Grade = "高三" }, new User { ID = "", Name = "李四", Grade = "高二" } }; IEqualityComparer<User> ec = new EntityComparer(); //1:直接应用Union的重装方法
//IEnumerable<TSource> Union<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second, IEqualityComparer<TSource> comparer)
IEnumerable<User> users1 = list1.Union(list2,ec).OrderBy(c=>c.ID); //IEnumerable<TSource> Distinct<TSource>(this IEnumerable<TSource> source, IEqualityComparer<TSource> comparer)
//2:使用Concat,然后再使用distinct方法
IEnumerable<User> users2 = list1.Concat(list2).Distinct(ec).OrderBy(c => c.ID); foreach (User item in users2)
Console.WriteLine("ID:{0,-7}Name:{1,-5}Grade:{2}", item.ID, item.Name, item.Grade); /*结果
ID = "0002", Name = "王二", Grade = "高三"
ID = "0003", Name = "张三", Grade = "高三"
ID = "0004", Name = "李四", Grade = "高二"
*/

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. js方法传入对象;js方法传入方法;js方法回调 callback

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. win10上跑 sqlserver 2000应用程序

    将SQL Server 安装程序\X86\SYSTEM\SQLUNIRL.DLL 替换到Win10 的 C:\windows\system32\目录下,64位win10 还要复制到SYSWOW64目录 ...

  3. C# 实现数字字符串左补齐0的两种方法

    ); MessageBox.Show(sss); return; 代码如上,自动补齐前面的0

  4. USBWebServer 中文便携版 快速搭建 PHP/MySQL 网站服务器环境

    如果你是一位 WEB 开发者,或正在学习网页编程,你一定会发现,每到一台新电脑上想要在本地调试测试/运行网站代码都得搭建配置一遍 WAMP (Win.Apache.PHP.MySQL) 环境简直烦透了 ...

  5. 安装yeoman报没有权限的错误

    新的ubuntu服务器, 不小心先装了npm, 再装的node, 再用meanjs装的yeoman(即不是自己npm install -g yo装的, 是用meanjs的stack一步到位的),而正常 ...

  6. 《HTTP权威指南》学习笔记——HTTP报文

    HTTP报文 HTTP:互联网的信使 HTTP报文:信使用来搬东西的包裹 1.报文流 HTTP报文:HTTP应用程序之间发送的数据块 组成:元信息开头(文本形式,描述报文的内容和含义)+可选的数据部分 ...

  7. vue加百度统计代码(亲测有效)

    申请百度统计后,会得到一段JS代码,需要插入到每个网页中去,在Vue.js项目首先想到的可能就是,把统计代码插入到index.html入口文件中,这样就全局插入,每个页面就都有了;这样做就涉及到一个问 ...

  8. Unity打包IOS和Android以及之间的交互

    1.导出的Xcode工程 主要讲解Unity导出的Xcode工程的目录结构 2.导出的Android-Eclipse工程 主要讲解Unity导出的Android-Eclipse工程的目录结构 3.导出 ...

  9. 关于android 内存的笔记

    原文 https://developer.android.com/training/articles/memory.html 1.慎重使用Service,最好的办法是使用IntentService,一 ...

  10. 土办法 填充NAS空间

    最近需要把一个1.8TB的NAS 塞满,网上东拼西凑,找了个办法 写脚本,然后保存为tt40.sh, 并上传到NAS中. #!/bin/sh echo "space2->space11 ...