LINQ, группировка по IEnumerable - PullRequest
0 голосов
/ 06 августа 2011

У меня есть следующие элементы (может быть больше двух):

new[] { new[] { "A" }, new[] { "B", "C" } }
new[] { new[] { "D" }, new[] { "E", "F" } }

Я хочу сгруппировать их следующим образом:

«А», «Д»

"B", "C", "E", "F"

Какой самый оптимальный (или хотя бы хороший) способ?

Можно ли как-то сохранить, чтобы в первой паре "D" (а во второй паре E "и" F ") в начале не было в одном массиве?

Ответы [ 2 ]

1 голос
/ 06 августа 2011

Предположим, у вас есть два в коллекции:

var collections = new[]
{
    new[] { new[] { "A" }, new[] { "B", "C" } },
    new[] { new[] { "D" }, new[] { "E", "F" } }
};

var result = from first in collections
             from second in first.Select((x, i) => new {x, i})
             from third in second.x
             group third by second.i;

Результат - IEnumerable<IGrouping<int, string>>, что означает, что каждый элемент представляет собой набор string с ключом int. Обратите внимание, что результат не может быть отсортирован, поэтому группа для 1 может быть на первом месте. Если вы не хотите этого, добавьте orderby в конец запроса.

1 голос
/ 06 августа 2011

Я только что столкнулся с этим вчера.Не самый читаемый, но он выполняет поставленную задачу.

new [] { 
    new[] { new[] { "A" }, new[] { "B", "C" } },
    new[] { new[] { "D" }, new[] { "E", "F" } }
}.SelectMany((x, arrayPos) => x.Select((y, itemPos) => new { y, arrayPos, itemPos }))
    .GroupBy(x => new { x.itemPos })
.Select(x => x.SelectMany(y => y.y.Select(z => new { z, y.arrayPos })))

Значение arrayPos будет указывать исходную позицию.

...