Я в основному намагаюся зробити власний порівняльник рядків даних, щось маленьке і зробити це простим.
В основному я намагаюся порівняти колонку Mykey1
в datatableA та Mykey2
у таблиці данихB.
Я отримую три помилки, і я не знаю, чомуїх кидають або як їх виправити. Так, я знаю, що я використовую цикл for int і змінюю його на рядок, але, очевидно, це лише лабораторія, і так, я буду порівнювати рядки.
Тут в помилках.
- Неможливо неявно перетворити тип "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."}
відкритий клас DataRowComparer: IEqualityComparer { public bool Дорівнює (DataRow x, DataRow y) { повернення x.ItemArray.Except (новий об'єкт [] {x ["Mykey1"]}) == y.ItemArray.Except (новий об'єкт [] {y ["Mykey2"]}); } public int GetHashCode (об'єкт DataRow) { значення var = obj.ItemArray.Except (новий об’єкт [] {obj [obj.Table.PrimaryKey [0] .ColumnName]}); хеш int = 0; foreach (значення змінної у значеннях) { хеш = (хеш * 397) ^ значення.GetHashCode (); } хеш повернення; } }
Відповіді:
2 для відповіді № 1String.Compare
повертає ціле число, а не рядок, тому вам потрібно змінити підпис методу порівняння. Це має вирішити першу помилку.
Решта помилок пов’язана з тим, що у ваших класах не вистачає необхідних реалізацій, оскільки помилка припускає, що ви пропускаєте System.Collections.Generic.IEqualityComparer.GetHashCode(System.Data.DataRow)
метод і System.Collections.Generic.IEqualityComparer.Equals(System.Data.DataRow, System.Data.DataRow)
метод