#c_sharp #linq
У менять есть словарь IDictionary> productDictionary В ProductModel есть строковый массив string[] codes. Как найти в словаре все ProductModel, у которых есть одинаковые значения в массивах codes? Т.е. у одной сущности codes = { '123', 1234'}, и у другой codes = { '12353453', 1234'}. Вот такие мне надо найти. У них есть совпадения по значению '1234'
Ответы
Ответ 1
Эммм... Взять все ProductModel: var productModels = productDictionary.Values.SelectMany(list => list); Сждойнить последовательность саму с собой и взять те пары ProductModel, у которых пересечение подколлекций codes не пустое: var res = productModels.Join(productModels, p1 => 1, p2 => 1, (p1, p2) => (p1, p2)) .Where(t => t.p1 != t.p2 && t.p1.codes.Intersect(t.p2.codes).Any()); На выходе получим кортеж из двух ProductModel. Если у вас компилятор/фреймворк не самые свежие - придется вместо кортежа использовать анонимный класс (new { p1, p2 } вместо (p1, p2)) Тут минус - будут получены пары (x, y) и (y, x) одновременно, чтобы их исключить придется переписать примерно так: var productModels = productDictionary.Values.SelectMany(list => list).ToList(); var result = from x in Enumerable.Range(0, productModels.Count) from y in Enumerable.Range(x + 1, productModels.Count - x - 1) where productModels[x].codes.Intersect(productModels[y].codes).Any() select new { p1 = productModels[x], p2 = productModels[y] }; Здесь мы материализуем коллекцию и у нас появляется возможность обращаться по индексу, поэтому мы в первом "цикле" перебираем все значения x от 0 до Count - 1, а во втором все y от x + 1 до Count - 1, это дает нам заведомо не повторяющиеся парыОтвет 2
Например, так: var result = productDictionary .Values // достаем перечень значений словаря .SelectMany(v => v) // собираем их в плоский перечень ProductModel .Where(p => p.codes.Distinct().Count() != p.codes.Length) // отбираем те ProductModel, у которых есть совпадения в codes .ToArray();
Комментариев нет:
Отправить комментарий