У меня есть две строковые массивы, newArray и oldArray, и я хочу использовать Enumberable.Except, чтобы удалить все элементы, которые находятся в newArray, которые также находятся в oldArray, а затем записать результат в файл csv.Enumerable.Except with IEqualityComparer
Однако мне нужно использовать пользовательский сопоставитель для проверки сходства форматирования (если в одном массиве есть новый символ строки, а не другой, я не хочу, чтобы этот элемент записывался в файл).
Мой код как сейчас:
string newString = File.ReadAllText(csvOutputFile1);
string[] newArray = newString.Split(new string[] {sentinel}, StringSplitOptions.RemoveEmptyEntries);
string oldString = File.ReadAllText(csvOutputFile2);
string[] oldArray = oldString.Split(new string[] { sentinel }, StringSplitOptions.None);
IEnumerable<string> differnceQuery = newArray.Except(oldArray, new Comparer());
using (var wtr = new StreamWriter(diffFile))
{
foreach (var s in differnceQuery)
{
wtr.WriteLine(s.Trim() + "#!#");
}
}
и пользовательский класс Comparer:
class Comparer : IEqualityComparer<string>
{
public bool Equals(string x, string y)
{
x = x.ToString().Replace(" ", "").Replace("\n", "").Replace("\r", "");
y = y.ToString().Replace(" ", "").Replace("\n", "").Replace("\r", "");
if (x == y)
return true;
else
return false;
}
public int GetHashCode(string row)
{
int hCode = row.GetHashCode();
return hCode;
}
}
Результирующий файл не опуская разница форматирования элементов между двумя массивами. Поэтому, хотя он ловит элементы, которые находятся в newArray, но не в oldArray (как и должно быть), он также помещает элементы, которые отличаются друг от друга только из-за \ n или что-то, даже если в моем пользовательском сопоставлении я их удаляю.
То, что я действительно не понимаю, - это когда я отлаживаю и просматриваю свой код, я вижу, что каждая пара элементов анализируется в моем классе сопоставления, но только когда они равны. Если, например, строка «This is \ nthe 1st term» находится в newArray, а строка «This is the first array» находится в oldArray, отладчик даже не вводит класс сравнения, а вместо этого перескакивает прямо в часть строки моей кода в основном классе.
не ваше выполнение 'GetHashCode' нужно вернуть одинаковые значения хэша для строк, которые отличаются только форматированием? – davisoa
Просто для справки, это было очень полезно. http://stackoverflow.com/questions/4095395/whats-the-role-of-gethashcode-in-the-iequalitycomparert-in-net?rq=1 –