2 dearwangzong dearwangzong 于 2016.03.22 20:36 提问

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
    那么这里到底是哪里有问题?是在没法查到资料

1个回答

caozhy
caozhy   Ds   Rxr 2016.03.22 23:23
已采纳
 其实用不着,最简单的是用GroupBy。
var Query = dt.Rows.OfType<DataRow>().GroupBy(x => x["Index"].ToString()).Select(x => x.First());
就可以了。
caozhy
caozhy 回复火焰猫麟: 但是没有必要定义一个类绕一个大弯子。
2 年多之前 回复
caozhy
caozhy 回复火焰猫麟: 你那样写的错误在于,hashcode如果不同,对象一定不同,所以你应该return row["index"].tostring().gethashcode()
2 年多之前 回复
dearwangzong
dearwangzong 谢谢,这就是我想要的结果!!谢谢层主给了我这个解答,我一晚上找了半天的答案终于得到了解答了
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C#实现 Linq 序列的Distinct—— IEnumerable<T>.Distinct<T>()——IEqualityComparer
简介  在C#中使用List或者Collection的时候,我们经常需要使用到Distinct操作,但是微软默认提供的Distinct重载方法并不能满足我们的需求。这时候,我们就需要自己动手做一番工作了。Distinct方法的重载  Linq的Distinct的方法有如下一个重载版本:public static IEnumerable<TSource> Distinc<TSource>( t
用泛型的IEqualityComparer<T>接口去重复项
写这个源于这个网友的题问:http://topic.csdn.net/u/20110803/16/031363d0-831d-4795-8c29-458d1271cc83.html?48229 题目:下列数据放在一个List中,当ID和Name都相同时,去掉重复数据 ID Name 1  张三 1  李三 1  小伟 1  李三  2  李四 2  李武 ------
C#学习笔记 IEquatable<T> 接口 IEqualityComparer<T> 接口
IEquatable 接口类内重写Equals方法,就可以实现比较。IEqualityComparer 接口可以写一个自定义类的比较类。 using System; using System.Collections.Generic; using System.Collections; namespace Wrox { public class MainEntryPoint { stat
用委托来实现IEqualityComparer<T>接口
直接上代码吧。class FuncEqualityComparer<T> : IEqualityComparer<T> { readonly Func<T, T, bool> _comparer; readonly Func<T, int> _hash; public FuncEqualityComparer( Func<T, T, bool> comparer )
[深入学习C#]——IEqualityComparer<T>中GetHashCode的作用
本文主要给自己看,内容太多,懒得写,直接附上参考博客。 参考一:C#——详析GetHashCode方法 参考二:.NET(C#):GetHashCode 的作用 参考三:What’s the role of GetHashCode in the IEqualityComparer in .NET?总结: 实现IEqualityCompare<T>接口的时候,需要实现Equals()和GetHa
IEqualityComparer<T>接口
IEqualityComparer接口的对象的主要作用在于自定义判断两个对象是否相等。 其中最常用的方法: bool Equals(T x, T y); 实现该方法用于比较两个对象是否相等。如果指定的对象相等,则为 true;否则为 false。 class Program { static void Main(string[] args) {
Linq 利用Except 去除重复数据并返回唯一数据( IEqualityComparer扩展)
前段时间做一个项目就是定时下载节目列表进行对文件时间和名字进行新旧对比进行去重复,众所周知,我们在Linq中去重复数据都用Distinct()做。但如果想多个条件进行对比去除重复数据,我们应该怎么办呢?请看下文,利用Except (通过使用默认的相等比较器对值进行比较,生成两个序列的差集。)_ // // 摘要: // 通过使用默认的相等比较器对值进行比较...
怎么使用LINQ方法来比较自定义类型对象
LINQ提供了方便的语法和很多操作对象集合的有用的方法。但是,要让LINQ比较方法如Distinct或Intersect能正确处理,类型必须要满足一些条件。 让我们看看Distinct方法,它从集合中返回所有的不重复对象。 List numbers = new List { 1, 1, 2, 3 }; var distinctNumbers = numbers.Distinct();
LINQ Except"引用类型"用法
值类型的比较Except 直接就比了引用类型的如下:var resultExcept = Expert_ItemSource.Except(Invert_ItemSource, new MyCompare()).ToList(); //比较器 public class MyCompare : IEqualityComparer<ConsultationExpertApiModel>
linq Distinct的一个简单实现方法
linq Distinct   IEnumerable> query1 = from e in jv group e by new { e.ReportId } into g select g.ToList(); 这段代码可以得到一个范型的集合(根据reportId分组后的范型集合),通过fo