【问题标题】:C# Errors when doing a simple datarow comparer执行简单数据行比较器时的 C# 错误
【发布时间】:2014-12-09 06:46:24
【问题描述】:

我基本上是在尝试做一个自定义数据行比较器,一些小而简单的东西。

基本上,我正在尝试比较 datatableA 中的列 Mykey1 和 datatableB 中的 Mykey2

我遇到了三个错误,我不确定为什么会抛出它们或如何更正它们。是的,我知道我正在使用 for int 循环并将其更改为字符串,但显然这只是一个实验室,是的,我将比较字符串。

在错误中。

  1. 无法将类型“int”隐式转换为“string”
  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."}

公共类 DataRowComparer : IEqualityComparer { 公共布尔等于(数据行 x,数据行 y) { 返回 x.ItemArray.Except(新对象[] { x["Mykey1"] }) == y.ItemArray.Except(新对象[] { y["Mykey2"] }); } 公共 int GetHashCode(DataRow obj) { var values = obj.ItemArray.Except(new object[] { obj[obj.Table.PrimaryKey[0].ColumnName] }); 整数哈希 = 0; foreach(值中的 var 值) { hash = (hash * 397) ^ value.GetHashCode(); } 返回哈希; } }

【问题讨论】:

  • 如果你能说出是哪一行产生了错误,那将会很有用。我能看到的唯一会产生它的地方是当您尝试获取 PrimaryKey 时,我会检查一下。

标签: c# datatable datarow


【解决方案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&lt;T&gt; 的一部分。
  • 谢谢,请看我的编辑,任何关于为什么我没有得到任何行的想法
猜你喜欢
  • 2015-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-14
  • 2021-03-11
  • 2014-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多