c# cook book -Linq 关于Object的比较
实际项目中经常用到 Union,Distinct,INtersect,Execpt对列表进行处理
一般来说要首先重写 Equals 和GetHashCode方法
首先看为重写的情况:
namespace LinqCookBook
{
class Program
{
static void Main(string[] args)
{
var model1 = new List<model>
{
new model(){name = ""},
new model(){name=""},
new model(){name = ""}
}; var model2 = new List<model>
{
new model() {name = ""},
new model() {name = ""},
new model() {name = ""}
}; var list = model1.Union(model2).Distinct();
foreach (var item in list)
{
Console.WriteLine(item.name);
}
}
} public class model
{
public string name { get; set; } //public override bool Equals(object obj)
//{
// return obj.GetHashCode().Equals(this.GetHashCode());
//} //public override int GetHashCode()
//{
// return this.name.GetHashCode();
//}
}
}
运行结果:
重写后:
namespace LinqCookBook
{
class Program
{
static void Main(string[] args)
{
var model1 = new List<model>
{
new model(){name = ""},
new model(){name=""},
new model(){name = ""}
}; var model2 = new List<model>
{
new model() {name = ""},
new model() {name = ""},
new model() {name = ""}
}; var list = model1.Union(model2).Distinct();
foreach (var item in list)
{
Console.WriteLine(item.name);
}
}
} public class model
{
public string name { get; set; } public override bool Equals(object obj)
{
return obj.GetHashCode().Equals(this.GetHashCode());
} public override int GetHashCode()
{
return this.name.GetHashCode();
}
}
}
运行结果:
原因:
当元素比较时,会使用默认规则比较,通过equals和gethashcode来确定应用类的一个实例和另一个实例是否相同。通常是不相同的,因为他们指向了不同的内存地址,导致哈希值是不同的。重写以后,认为某些属性值相同则认为相同。
c# cook book -Linq 关于Object的比较的更多相关文章
- .NET面试题系列[13] - LINQ to Object
.NET面试题系列目录 名言警句 "C# 3.0所有特性的提出都是更好地为LINQ服务的" - Learning Hard LINQ是Language Integrated Que ...
- LINQ系列:Linq to Object投影操作符
投影是指在将序列中的元素转换为一个自定义形式的操作.投影操作符Select和SelectMany用于选择出赋予了适当功能的值.SelectMany操作符可以处理多个集合. LINQ表达式语法: 1. ...
- LINQ系列:Linq to Object生成操作符
生成操作符从现有序列值中创建新的序列. 1. Empty Empty操作符返回一个指定类型的空集. 1>. 原型定义 public static IEnumerable<TResult& ...
- LINQ系列:Linq to Object转换操作符
转换是指将输入对象的类型转变为序列的动作. 1. AsEnumerable AsEnumerable操作符将查询的输入以IEnumberable(T)类型返回. 2. Cast Cast操作符将IEn ...
- LINQ系列:Linq to Object量词操作符
量词操作符返回一个Boolean值,指示序列中是否存在部分或全部元素符号指定条件.LINQ中量词操作符包括:All.Any和Contains. 1. All All操作符判定在集合中是否所有的值都满足 ...
- LinQ To Object 基本用法
http://www.cnblogs.com/terryzh/archive/2012/11/10/2763538.html LinQ To Object 基本用法 inq的基本语法:var resu ...
- SQO (标准查询运算符)方法 & Linq To Object
#region SQO (标准查询运算符) 方法 #region Where() Find() FindAll() FirstOrDefault()等方法 static void c01where() ...
- 1.解剖Linq to object
LINQ想必大家都不陌生了,它的出现使得我们的代码变得更短.更优雅了.至于LINQ是什么,Linq to object这类的扩展方法到底做了些什么.我们使用的EF是如何实现的(如何解析Expressi ...
- Linq to EF 与Linq to Object 使用心得
大家都知道Linq既可以用来查询数据库对象(我这里指的是Entity FrameWork里的Model对象),也可以用来查询内存中的IEnumerable对象. 两者单独查询时都不会出现什么问题,不过 ...
随机推荐
- ThreadLocalRandom原理
原文链接:https://www.jianshu.com/p/9c2198586f9b 2.2. 并发包中ThreadLocalRandom类原理剖析 ThreadLocalRandom类是JDK7在 ...
- StampedLock原理
原文链接:https://blog.csdn.net/sunhaoning/article/details/68924625 StamppedLock是Java 8中引入的一种新的锁机制.读写锁虽然分 ...
- php 读取excel文件
首先下载插件PHPExcel (PHPExcel-1.8),以tp5框架为例,将该文件放在verdor文件夹下.然后引入IOFactory文件. 1.读取文件的部分内容(用于固定格式) public ...
- socket 释放全过程
1.close()函数:立即返回到进程 int close(int sockfd); //返回成功为0,出错为-1. close 一个套接字的默认行为是把套接字标记为已关闭,然后立即返回到调用 ...
- CF1101B Accordion 模拟
前后扫一遍: #include<iostream> #include<cstdio> #include<algorithm> #include<cstdlib ...
- kuangbin专题十二 POJ1661 Help Jimmy (dp)
Help Jimmy Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 14214 Accepted: 4729 Descr ...
- php暂停函数sleep()和usleep的区别
在PHP中暂停代码执行一定时间,有两个函数可以实现,一个是sleep(),另一个是usleep(),它们参数都是一个整数值.sleep()是暂停多少秒,usleep()是暂停多少微秒. 注意:usle ...
- 安装maven时遇到的问题
配置好环境变量和本地仓库后,在命令行里输入mvn compile,可以显示成功,但是mvn install后就一直失败.显示如下错误: 在idea中显示如下错误: 其实即使显示编译成功,但并没有真正的 ...
- P4245 【模板】任意模数NTT
Luogu4245 只要做三次的NTT,快的飞起 普通NTT,做9次 #include<cstdio> #include<cstring> #include<iostre ...
- 浅谈ORM操作
2. ORM(对象关系映射) 1. 映射的关系 DB ORM 数据表 <--> 类 数据行 <--> 对象 字段 <--> 属性 2. Django项目使用MySQ ...