linq-LINQ关于IEqualityComparer<T> 接口的问题

问题描述

LINQ关于IEqualityComparer<T> 接口的问题

Linq的Distinct()方法不是说筛选数据内重复的数据吗?
原谅我只是刚学LINQ,也查阅了资料,但是我依然无法理解。
我按照书上看的,实现了一个IEqualityComparer 接口,如果真按照书上说的使用一个List的方式来做筛选的确是没问题。
于是突然想到,既然IEqualityComparer 接口是一个泛型,那么我传入一个DataRow也是可以的?
于是就写了代码
DataTable dt = new DataTable();
dt.Columns.Add("Index", typeof(int));

DataRow row = dt.NewRow();
row["Index"] = "1";
dt.Rows.Add(row);

DataRow row1 = dt.NewRow();
row1["Index"] = "2";
dt.Rows.Add(row1);

DataRow row2 = dt.NewRow();
row2["Index"] = "2";
dt.Rows.Add(row2);

RowIEqualityComparer rowEq = new RowIEqualityComparer();
var Query = dt.Rows.OfType().Distinct(rowEq);
foreach (DataRow item in Query)
{
Console.WriteLine(item["Index"].ToString());
}
Console.ReadLine();

public class RowIEqualityComparer:IEqualityComparer
{
public bool Equals(DataRow row1,DataRow row2)
{
if (row1==null&&row2==null)
{
return true;
}
if (row1==null||row2==null)
{
return false;
}
if (row1["Index"].ToString()==row2["Index"].ToString())
{
return false;
}
return true;
}

    public int GetHashCode(DataRow row)
    {
        return row.GetHashCode();
    }
}

    程序也没有报错,按照常规来理解,这样的代码最终执行的输出结果应该是
    1
    2
    但是实际上缺输出了
    1
    2
    2
    那么这里到底是哪里有问题?是在没法查到资料

解决方案

 其实用不着,最简单的是用GroupBy。
var Query = dt.Rows.OfType<DataRow>().GroupBy(x => x["Index"].ToString()).Select(x => x.First());
就可以了。
时间: 2024-11-16 03:54:54

linq-LINQ关于IEqualityComparer&amp;lt;T&amp;gt; 接口的问题的相关文章

AgileEAS.NET 4.0重构裁剪,新的ORM、支持Linq,正式支持WPF,开放更多的接口

        很久没有和大家交流了,今天出来给大家汇报一下AgileEAS.NET平台的最新进展:          AgileEAS.NET是一套企业级的快速开发平台或者说是中间件,主要服务于中小软件企业,以提高软件企业的有效生产率为主要目标,结合软件工程.dotnet构件技术.快速工作为其提供一个适合中国特色的中小软件企业的软件生产解决方案.          AgileEAS.NET平台自2004年底出了第一版本并且应用于实际项目之中,广泛的应用于医疗.保险.互联网.铁路.房地产.农业等

Linq To Xml学习 - 1.LINQ to XML 概述

LINQ to XML 是一种启用了 LINQ 的内存 XML 编程接口,使用它,可以在 .NET Framework 编程语言中处理 XML. 它将 XML 文档置于内存中,这一点很像文档对象模型 (DOM). 您可以查询 和修改 XML 文档,修改之后,可以将其另存为文件,也可以将其序列化然后通 过网络发送. 但是,LINQ to XML 与 DOM 不同: 它提供一种新的对象模型, 这是一种更轻量的模型,使用也更方便,这种模型利用了 Visual C# 2008 在语 言方面的改进. LI

使用linq to xml快速创建自己的Rss

首先引用网络上不知道是谁的一段文字来讲述下什么是linq to xml 如果已 经熟悉的就直接跳过这段: LINQ to XML 是一种启用了 LINQ 的内存 XML 编程接口,使用它,可以在 .NET Framework 编程语言中处理 XML. 它将 XML 文档置于内存中,这一点很像文档对象模型 (DOM). 您可以 查询和修改 XML 文档,修改之后,可以将其另存为文件,也可以将其序列化然 后通过网络发送. 但是,LINQ to XML 与 DOM 不同: 它提供一种新的对象模 型,这

打造自己的LINQ Provider(中):IQueryable和IQueryProvider

概述 在.NET Framework 3.5中提供了LINQ 支持后,LINQ就以其强大 而优雅的编程方式赢得了开发人员的喜爱,而各种LINQ Provider更是满天飞, 如LINQ to NHibernate.LINQ to Google等,大有"一切皆LINQ"的 趋势.LINQ本身也提供了很好的扩展性,使得我们可以轻松的编写属于自己的 LINQ Provider. 本文为打造自己的LINQ Provider系列文章第二篇,主 要详细介绍自定义LINQ Provider中两个最重

.Net开发必备十大工具详解之查询表达式(LINQ)

LINQ是Language Integrated Query的简称,它是集成在.NET编程语言中的一种特性.已成为编程语言的一个组成部分,在编写程序时可以得到很好的编译时语法检查,丰富的元数据,智能感知.静态类型等强类型语言的好处.并且它同时还使得查询可以方便地对内存中的信息进行查询而不仅仅只是外部数据源. LINQ定义了一组标准查询操作符用于在所有基于.NET平台的编程语言中更加直接地声明跨越.过滤和投射操作的统一方式,标准查询操作符允许查询作用于所有基于IEnumerable<T>接口的源

Linq To Sql进阶系列(一)-从映射讲起

本系列,或多或少,直接或间接依赖入门系列知识.但,依然追求独立成章.因本文作者水平有限, 文中错误难免,敬请读者指出并谅解.本系列将会和入门并存. 案例 某君被邀为一超市设计数据库,用来存储数据.该君根据该超市中实际出现的对象,设计了 Customer, Employee,Order, Product等表,用来保存相应的客户,员工,订单,货品等.太好了,该 君很有oo的思想吗. 如果,你被要求用类及对象,来描述该关系型数据,你该如何做呢?在linq推出之前,ADO.NET被用 来做数据访问层.而

Linq入门——什么是linq &amp;amp; 扩展方法

 一,什么是Linq                      linq(language integrated Query):语言集成查询:      linq包含如下:                 对对象的查询,对数据库的查询,对XML的查询.       那么,没有linq前我们是怎样查询的?             先看一个例子:             现在我们要查询大于50的数,:          在没有linq之前,我们的代码时这样的:                   

asp.net使用LINQ to SQL连接数据库及SQL操作语句用法分析_实用技巧

本文实例讲述了asp.net使用LINQ to SQL连接数据库及SQL操作语句用法.分享给大家供大家参考,具体如下: LINQ简介 LINQ:语言集成查询(Language INtegrated Query)是一组用于c#和Visual Basic语言的扩展.它允许编写C#或者Visual Basic代码以查询数据库相同的方式操作内存数据. LINQ是一门查询语言,和SQL一样,通过一些关键字的组合,实现最终的查询. LINQ的分类 LINQ to Object LINQ to XML LIN

System.Linq

System.Linq LINQ,语言级集成查询(Language INtegrated Query)          经过了最近 20 年,面向对象编程技术( object-oriented (OO) programming technologies )在工业领域的应用已经进入了一个稳定的发展阶段.程序员现在都已经认同像 类(classes).对象(objects).方法(methods)这样的语言特性.考察现在和下一代的技术,一个新的编程技术的重大挑战开始呈现出来,即面向对象技术诞生以来并