执行简单数据行比较器时的 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."

公共类 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 时,我会检查一下。 【参考方案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; 的一部分。 谢谢,请看我的编辑,任何关于为什么我没有得到任何行的想法

以上是关于执行简单数据行比较器时的 C# 错误的主要内容,如果未能解决你的问题,请参考以下文章

在 DataTable C# 中比较和查找行值

转解决存储过程执行快,但C#程序调用执行慢的问题

c#中往mysql里批量插入上万条数据,有比较高效的方法吗

C# 意外的循环性能。可能的 JIT 绑定检查错误? [关闭]

核心数据:使用延迟实例化时的奇怪错误行为

C# 在Winform设计一个耗时较久的任务在后台执行时的状态提示窗口