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.
如果当我说"一次一个"时,我的意思仍然存在混淆,想象一下,col1而col2不是具有重复的不同类型的大理石的集合.我希望形成col3这样的形状,即我拥有最少量的不同类型的大理石,这样我就可以从col3形状中移除足够的大理石col1,然后将大理石放回去col3,然后移除足够的大理石形成col2.
我很乐意,如果答案使用LINQ来提出解决问题的单个表达式,因为到目前为止我想到的两种方法涉及:
col1,然后在处理时执行"标记和插入"类型操作col2,从而生成一个最终字典,其中每个整数的计数足以满足我的条件.更新:保证输入集合被排序(即,单调和非减少),并且结果集合应该具有相同的顺序.
像这样:
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)