实际项目中经常用到 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的比较的更多相关文章

  1. .NET面试题系列[13] - LINQ to Object

    .NET面试题系列目录 名言警句 "C# 3.0所有特性的提出都是更好地为LINQ服务的" - Learning Hard LINQ是Language Integrated Que ...

  2. LINQ系列:Linq to Object投影操作符

    投影是指在将序列中的元素转换为一个自定义形式的操作.投影操作符Select和SelectMany用于选择出赋予了适当功能的值.SelectMany操作符可以处理多个集合. LINQ表达式语法: 1. ...

  3. LINQ系列:Linq to Object生成操作符

    生成操作符从现有序列值中创建新的序列. 1. Empty  Empty操作符返回一个指定类型的空集. 1>. 原型定义 public static IEnumerable<TResult& ...

  4. LINQ系列:Linq to Object转换操作符

    转换是指将输入对象的类型转变为序列的动作. 1. AsEnumerable AsEnumerable操作符将查询的输入以IEnumberable(T)类型返回. 2. Cast Cast操作符将IEn ...

  5. LINQ系列:Linq to Object量词操作符

    量词操作符返回一个Boolean值,指示序列中是否存在部分或全部元素符号指定条件.LINQ中量词操作符包括:All.Any和Contains. 1. All All操作符判定在集合中是否所有的值都满足 ...

  6. LinQ To Object 基本用法

    http://www.cnblogs.com/terryzh/archive/2012/11/10/2763538.html LinQ To Object 基本用法 inq的基本语法:var resu ...

  7. SQO (标准查询运算符)方法 & Linq To Object

    #region SQO (标准查询运算符) 方法 #region Where() Find() FindAll() FirstOrDefault()等方法 static void c01where() ...

  8. 1.解剖Linq to object

    LINQ想必大家都不陌生了,它的出现使得我们的代码变得更短.更优雅了.至于LINQ是什么,Linq to object这类的扩展方法到底做了些什么.我们使用的EF是如何实现的(如何解析Expressi ...

  9. Linq to EF 与Linq to Object 使用心得

    大家都知道Linq既可以用来查询数据库对象(我这里指的是Entity FrameWork里的Model对象),也可以用来查询内存中的IEnumerable对象. 两者单独查询时都不会出现什么问题,不过 ...

随机推荐

  1. LinkedList实现原理

    原文链接:https://www.jianshu.com/p/56c77c517e71 本文对LinkedList的实现讨论都基于JDK8版本 Java中的LinkedList类实现了List接口和D ...

  2. [比赛|考试]nowcoder NOIP提高组组第二场

    160/300pts,rank16(100,30,30) 在自身找毛病,首先做题感觉还不不够认真,比如T3那个我一开始审出来了,然后tmd忘了...gg...T1AC没啥好赞美的,T2T3暴力没拿全啊 ...

  3. php 生成读取csv文件并解决中文乱码

    csv其实是文本文件,但是里面的内容是利用逗号分隔的. 1. 生成csv文件 function new_csv($arr) { $string=""; foreach ($arr ...

  4. 8.Move Zeroes(移动零)

    Level:   Easy 题目描述: Given an array nums, write a function to move all 0's to the end of it while mai ...

  5. kuangbin专题十六 KMP&&扩展KMP HDU3746 Cyclic Nacklace

    CC always becomes very depressed at the end of this month, he has checked his credit card yesterday, ...

  6. ssh 配置无密码登录

    下框中在管理机上运行: [root@master ~]# ssh-keygen -t rsa #它在/root/.ssh下生成id_rsa和id_rsa.pub两个文件 [root@master ~] ...

  7. bashrc 与 profile 环境变量

    profile 和 bashrc profile只在登陆的时候使用一次(当我们使用远程登陆上),而bashrc在每次新打开一个bash的时候都会执行(相当于path环境(登陆上了每次打开终端)) pr ...

  8. kubernetes相关命令

    关闭防火墙 [关闭swap] 执行swapoff -a可临时关闭,但系统重启后恢复 编辑/etc/fstab,注释掉包含swap的那一行即可永久关闭 [关闭SeLinux] sed -i 's/SEL ...

  9. SprimgMVC学习笔记(三)—— 参数绑定

    一.默认支持的参数类型 1.1 需求 打开商品编辑页面,展示商品信息. 1.2 需求分析 编辑商品信息,首先要显示商品详情 需要根据商品id查询商品信息,然后展示到页面. 请求的url:/itemEd ...

  10. Luogu P4404 [JSOI2010]缓存交换 优先队列

    细节题?...调了半天.... 可以发现,每一次从缓存中删除的主存一定是下次访问最晚的,可以用优先队列来处理...还有要离散化...还有链表末尾要多建一些点...否则会死的很惨... #include ...