Linq 集合处理(Union)
关于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)的更多相关文章
- Linq集合操作之Intersect,Except,Union源码分析
Linq集合操作之Intersect,Except,Union源码分析 linq的集合运算 常见的集合运算有哪些? 这三个扩展方法在我们实际使用中用的还是非常多的,而且这里还涉及到了“复杂度” 无算法 ...
- Linq 集合操作
Linq 集合操作 演示代码 两个对象一个是Person,一个Address, AddressId是外键, public class Person { public string ID { get; ...
- linq集合内部赋值
linq集合内部赋值 比如将一个列的值,赋值给另一列 有三种方法: 1. e.Result.ToList().ForEach(n => n.IsIntermediarybool = SetIsI ...
- Oracle SQL Lesson (8) - 使用集合操作符(Union,Intersect,Minus)
集合操作符UNION/UNION ALLINTERSECTMINUS Union All不排序,不去重,其余均升序且去重.create table e1 as select * from emp wh ...
- 集合运算—union(并集)、intersect(交集)和except(差集)
一.集合运算的基本格式是: 集合查询1 <集合运算> 集合查询2 [order by ...] 二.集合运算符是对两个集合操作的,两个集合必须具有相同的列数,列具有相同的数据类型(至少能隐 ...
- Python杂谈: 集合中union和update的区别(Python3.x)
集合中union和update方法都是将多个可迭代的对象合并,但是返回的结果和对初始对象的影响却不一样 # union() 方法 - a.union(b) 将集合a和集合b取并集,并将并集作为一个新的 ...
- 集合操作符 Union / Union All / Intersect / Minus
集合操作符 Union / UnionAll / Intersect / Minus -- 生成测试数据 create table dept_01 as select * from dept wher ...
- Linq 集合操作符 Except,Intersect,Union
IList<string> s1 = new List<string>() { "One", "Two", "Three&qu ...
- 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 ...
随机推荐
- Http请求的工具
1.火狐的插件 HttpRequester 安装方法:火狐浏览器的最右上角的菜单,打开附件组件 ,搜索:HttpRequester,重启火狐浏览器.在菜单栏的工具下可以看到 HttpRequester ...
- Spring Cloud 微服务的那点事
什么是微服务 微服务的概念源于2014年3月Martin Fowler所写的一篇文章“Microservices”. 微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调 ...
- 激活函数ReLU、Leaky ReLU、PReLU和RReLU
“激活函数”能分成两类——“饱和激活函数”和“非饱和激活函数”. sigmoid和tanh是“饱和激活函数”,而ReLU及其变体则是“非饱和激活函数”.使用“非饱和激活函数”的优势在于两点: 1 ...
- UITableView:可展开的 UITableView
针对 TableView,有些时候需要在点击 cell 时,展开这行 cell,显现出更多的选项或者全部内容等. 比较容易想到的处理方案就是利用 section,在未选择之前,每一行都是一个 sect ...
- hive以文件创建表
create table location( location string, ip string, name string, city string, classfication string, c ...
- 【伪装位置神器】神行者AnyLocation 1.3.0001可用于微信,陌陌
<ignore_js_op> 软件名称:神行者(破解)软件版本:v1.3.0001授权类别:免费测试机型:大可乐手机 下载链接: http://pan.baidu.com/s/1qWwSM ...
- UNIX环境编程学习笔记(6)——文件I/O之判断文件类型
lienhua342014-09-01 1 文件类型 我们平时最常接触的文件类型有普通文件(regular file)和目录(di-rectory file),但是 UNIX 系统提供了多种文件类型: ...
- MathType让矩阵中的小数以小数点对齐的教程
用MathType编辑公式时,有很多模板都可以应用,并且这些模板并不是只有一种用途,比如矩阵.矩阵模板可以用来编辑矩阵也可是用来编辑一些需要排列组合的数据等等.在用MathType编辑矩阵时,如果里面 ...
- centos 中文乱码解决途径
在使用CentOS系统时,安装的时候可能你会遇到英文的CentOS系统,在这中情况下安装CentOS系统时是默认安装(即英文).安装完毕后,出现的各种中文乱码.那么,我们如何解决这种问题呢. 一.Ce ...
- Linux中什么是块设备 及 lsblk命令的使用
Linux中I/O设备分为两类:字符设备和块设备.两种设备本身没有严格限制,但是,基于不同的功能进行了分类.(1)字符设备:提供连续的数据流,应用程序可以顺序读取,通常不支持随机存取.相反,此类设备支 ...