基本上,我试图做一个自定义的数据行比较器,小东西,并保持它的简单。
基本上我试图比较列Mykey1
在datatableA和Mykey2
在datatableB。
我得到三个错误,我不知道为什么他们被抛出或如何解决这些问题。 是的,我知道我在使用了INT循环,并将其转变为一个字符串,但显然这只是一个实验室,是的,我会比较字符串。
在这里,在错误。
- 无法隐式转换类型“诠释”到“字符串”
- 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."}
public class DataRowComparer : IEqualityComparer { public bool Equals(DataRow x, DataRow y) { return x.ItemArray.Except(new object[] { x["Mykey1"] }) == y.ItemArray.Except(new object[] { y["Mykey2"] }); } public int GetHashCode(DataRow obj) { var values = obj.ItemArray.Except(new object[] { obj[obj.Table.PrimaryKey[0].ColumnName] }); int hash = 0; foreach (var value in values) { hash = (hash * 397) ^ value.GetHashCode(); } return hash; } }