执行两个IEnumerable集合的联合类型

Mic*_*eyn 4 c# .net-4.0 visual-studio-2010 c#-4.0

假设你有两个整数集合:

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};
Run Code Online (Sandbox Code Playgroud)

现在我想创建第三个集合col3,使得对于出现在任何每个不同的元素col1或者col2,col3将包含元素至少多达occurances在任何COL1或COL2,但元素出现的最大数目没有更多.让我展示最终结果,然后进一步阐述:

   IEnumerable<int> col3=...;
Run Code Online (Sandbox Code Playgroud)

col3的内容应该是:

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

作为这种"伪联合"操作的结果,描述col3的内容的另一种方式是它应该包含每个值的足够元素,但不能再包含,以便两个原始集合中的任何一个可以单独形成(即,一个一次,从col3中的整个数字域中提取元素col3.

如果当我说"一次一个"时,我的意思仍然存在混淆,想象一下,col1col2不是具有重复的不同类型的大理石的集合.我希望形成col3这样的形状,即我拥有最少量的不同类型的大理石,这样我就可以从col3形状中移除足够的大理石col1,然后将大理石放回去col3,然后移除足够的大理石形成col2.

我很乐意,如果答案使用LINQ来提出解决问题的单个表达式,因为到目前为止我想到的两种方法涉及:

  1. 合并包含直方图的字典(即每个不同整数的出现次数).
  2. 从处理构造字典col1,然后在处理时执行"标记和插入"类型操作col2,从而生成一个最终字典,其中每个整数的计数足以满足我的条件.

更新:保证输入集合被排序(即,单调和非减少),并且结果集合应该具有相同的顺序.

SLa*_*aks 6

像这样:

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()
                   )
                ));
Run Code Online (Sandbox Code Playgroud)