Неверно отрабатывает 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мс


Ответы (0 шт):