Выполнение типа объединения двух коллекций IEnumerable - PullRequest
4 голосов
/ 24 октября 2010

Допустим, у вас есть две коллекции целых чисел:

IEnumerable<int> col1=new List<int> {2,3,3,5,7,11,11,11,13};
IEnumerable<int> col2=new List<int> {5,7,7,7,11,19};

Теперь я хотел бы создать третью коллекцию col3, такую, что для каждого отдельного элемента, который появляется либо в col1, либо col2, col3 будет содержать этот элемент с по меньшей мере таким же количеством вхождений, что и максимальное количество вхождений элемента в col1 или col2, но не более.Позвольте мне показать конечный результат, а затем уточнить:

   IEnumerable<int> col3=...;

Содержимое col3 должно быть:

{2,3,3,5,7,7,7,11,11,11,13,19}

Еще один способ описать содержимое col3 как результат этой операции «псевдо-объединения» состоит в том, что он должен содержать достаточно элементов каждого значения, но не более, такихчто любую из двух исходных коллекций можно сформировать по отдельности (то есть по одной за раз из всего домена чисел в col3), извлекая элементы из col3.

Если по-прежнему возникает путаница из-за того, что я имею в виду, когда говорю «по одному», представьте, что col1 и col2 вместо этого представляют собой коллекции разных типов мрамора с дубликатами.Я хочу сформировать col3 таким образом, чтобы у меня было минимальное количество различных типов шариков, чтобы я мог убрать достаточное количество шариков из col3, чтобы сформировать col1, затем поместить шарики обратно в col3, а затем удалитьдостаточно шариков, чтобы сформировать col2.

Мне бы очень понравилось, если бы в ответе использовалось LINQ, чтобы придумать единственное выражение, которое решает проблему, потому что два метода, о которых я до сих пор думал, включают:

  1. Объединение словарей, которые содержат гистограммы (т. Е. Количество вхождений каждого другого целого числа).
  2. Создание словаря из col1, а затем выполнение операции типа «пометить и вставить» во время обработкиcol2, в результате чего получается итоговый словарь с достаточным количеством для каждого целого числа, удовлетворяющим моим критериям.

Обновление: входные коллекции гарантированно сортируются (т. Е. Монотонны и не убывают) иПолученная коллекция должна быть в том же порядке.

1 Ответ

6 голосов
/ 24 октября 2010

Как это:

var groups1 = col1.ToLookup(e => e);
var groups2 = col2.ToLookup(e => e);

var col3 = col1.Union(col2)
               .SelectMany(e => Enumerable.Repeat(e, 
                   Math.Max(
                            groups1[e].Count(), 
                            groups2[e].Count()
                   )
                ));
...