做一个简单的数据行比较器时C#错误(C# Errors when doing a simple da

2019-10-21 03:12发布

基本上,我试图做一个自定义的数据行比较器,小东西,并保持它的简单。

基本上我试图比较列Mykey1在datatableA和Mykey2在datatableB。

我得到三个错误,我不知道为什么他们被抛出或如何解决这些问题。 是的,我知道我在使用了INT循环,并将其转变为一个字符串,但显然这只是一个实验室,是的,我会比较字符串。

在这里,在错误。

  1. 无法隐式转换类型“诠释”到“字符串”
  2. ConsoleApplication2.MyDataRowComparer“不实现接口成员” System.Collections.Generic.IEqualityComparer.GetHashCode(的System.Data.DataRow)
  3. 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;
        }
    }

Answer 1:

String.Compare返回一个整数,而不是一个字符串,那么您需要更改您的比较方法签名。 这应该解决的第一个错误。

你的错误的其余部分是由于您缺少必要的实现类中的一个事实,错误提示你缺少的System.Collections.Generic.IEqualityComparer.GetHashCode(System.Data.DataRow)方法和System.Collections.Generic.IEqualityComparer.Equals(System.Data.DataRow, System.Data.DataRow)方法。



文章来源: C# Errors when doing a simple datarow comparer