执行简单数据行比较器时的 C# 错误
Posted
技术标签:
【中文标题】执行简单数据行比较器时的 C# 错误【英文标题】:C# Errors when doing a simple datarow comparer 【发布时间】:2014-12-09 06:46:24 【问题描述】:我基本上是在尝试做一个自定义数据行比较器,一些小而简单的东西。
基本上,我正在尝试比较 datatableA 中的列 Mykey1
和 datatableB 中的 Mykey2
。
我遇到了三个错误,我不确定为什么会抛出它们或如何更正它们。是的,我知道我正在使用 for int 循环并将其更改为字符串,但显然这只是一个实验室,是的,我将比较字符串。
在错误中。
-
无法将类型“int”隐式转换为“string”
ConsoleApplication2.MyDataRowComparer' 没有实现接口成员'System.Collections.Generic.IEqualityComparer.GetHashCode(System.Data.DataRow)
ConsoleApplication2.MyDataRowComparer' 没有实现接口成员 'System.Collections.Generic.IEqualityComparer.Equals(System.Data.DataRow, System.Data.DataRow)
这里是代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
namespace ConsoleApplication2
class Program
static void Main(string[] args)
DataTable DT1 = dt1();
DataTable DT2 = dt2();
IEnumerable<DataRow> idrP = DT1.AsEnumerable();
IEnumerable<DataRow> idrS = DT2.AsEnumerable();
MyDataRowComparer MyComparer = new MyDataRowComparer();
IEnumerable<DataRow> Results = idrS.Except(idrP, MyComparer);
private static DataTable dt1()
DataTable DT1 = new DataTable();
DT1.Columns.Add("Mykey1");
for (int i = 0; i < 10000; i++)
DataRow newRow = DT1.NewRow();
newRow[0] = i.ToString();
DT1.Rows.Add(newRow);
return DT1;
private static DataTable dt2()
DataTable DT2 = new DataTable();
DT2.Columns.Add("Mykey2");
for (int i = 0; i < 20000; i++)
DataRow newRow = DT2.NewRow();
newRow[0] = i.ToString();
DT2.Rows.Add(newRow);
return DT2;
public class MyDataRowComparer : IEqualityComparer<DataRow>`
public string Compare(DataRow x, DataRow y)
return String.Compare(x.Field<string>("Mykey1"), y.Field<string>("Mykey2"));
编辑
这是我的新 DataRowComparer,但它没有返回任何结果,而是我得到了
"Index was outside the bounds of the array."
【问题讨论】:
如果你能说出是哪一行产生了错误,那将会很有用。我能看到的唯一会产生它的地方是当您尝试获取 PrimaryKey 时,我会检查一下。 【参考方案1】:String.Compare
返回一个整数而不是字符串,因此您需要更改您的 Compare 方法签名。
这应该可以解决第一个错误。
其余的错误是由于您的类中缺少所需的实现,因为该错误表明您缺少 System.Collections.Generic.IEqualityComparer.GetHashCode(System.Data.DataRow)
方法和 System.Collections.Generic.IEqualityComparer.Equals(System.Data.DataRow, System.Data.DataRow)
方法。
【讨论】:
+1 和MyDataRowComparer.Compare
不会被调用,因为它不是接口IEqualityComparer<T>
的一部分。
谢谢,请看我的编辑,任何关于为什么我没有得到任何行的想法以上是关于执行简单数据行比较器时的 C# 错误的主要内容,如果未能解决你的问题,请参考以下文章