假设您有两个整数集合:
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来提出解决问题的单个表达式,因为到目前为止我想到的两种方法都涉及:
col1
构造字典,然后在处理col2
时执行“标记和插入”类型操作,从而生成一个最终字典,其中每个整数的计数足以满足我的标准。更新:保证对输入集合进行排序(即单调和非减少),结果集合的顺序应相同。
答案 0 :(得分: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()
)
));