Неверно отрабатывает Linq GroupJoin
Дано
2 таблицы DataTable
Первая [...,"город",...]
Вторая ["id", "city",...]
Я хочу перенести id из одно в другую.
КОД который ломается
DtLeft.Rows.Cast<DataRow>() //первая таблица
.GroupJoin(
DtRight.Rows.Cast<DataRow>(), //вторая таблица
keyL => ColumnsJoin.GetKeyL(keyL), //первый ключ
keyR => ColumnsJoin.GetKeyR(keyR), //второй ключ
(rowL, rowR) => (rowL, rowR.FirstOrDefault()), //желаемый результат
new EqualityComparerStringArray(ColumnsJoin.ColumnsKey)) //"умный" сравнитель
.ToList();
Внутренности EqualityComparerStringArray
/// <summary>Колонки в таблице</summary>
internal ColumnTwoBase[] Columns;
public bool Equals(string[] x, string[] y)
{
Console.WriteLine($"{x[0]} and {y[0]}");
for (int i = 0; i < Columns.Length; i++)
{
if (!Columns[i].Equal(x[i], y[i]))
{ return false; }
}
return true;
}
public int GetHashCode(string[] obj) => obj.Aggregate((a, b) => $"{a}{b}").GetHashCode();
Не знаю хватит ли данных для имитации ситуации но проблема следующая
пример: первая таблица
[
{..,"кировский Астрахань",..},
{..,"ленинский Астрахань",..},
]
вторая таблица
[
{0,"Астрахань"},
{1,"Саратов"},
]
Да тут вы спросите типо ЧЁ ты ж сравниваешь "кировский Астрахань" и "Астрахань"
Нет метод Equal внутри имеет Func и в данном случае проверяет что в левой колонке Containt правая
Console.WriteLine($"{x[0]} and {y[0]}");
А вот что в консоли
Астрахань and Астрахань
Саратов and Саратов
И тишина...
Ну то есть на выходе следующее
[
({..,"кировский Астрахань",..}, null),
({..,"ленинский Астрахань",..}, null)
]
просто join пробовал
FirstOrDefault() убирал.
from пробовал но не понял как туда подсунуть кастомный Equal
Итого: кастыльное решение это сделать HASH у всех одинаковым
Однако хочется красивое...
При 50 записях в первой и 2500 во второй время на обработку 586мс