Страницы

Поиск по вопросам

пятница, 26 октября 2018 г.

Как найти одинаковые вхождения в словаре?

У менять есть словарь IDictionary> productDictionary В ProductModel есть строковый массив string[] codes. Как найти в словаре все ProductModel, у которых есть одинаковые значения в массивах codes? Т.е. у одной сущности codes = { '123', 1234'}, и у другой codes = { '12353453', 1234'}. Вот такие мне надо найти. У них есть совпадения по значению '1234'


Ответ

Эммм... Взять все 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, это дает нам заведомо не повторяющиеся пары

Комментариев нет:

Отправить комментарий