gpt4 book ai didi

c# - 执行两个 IEnumerable 集合的联合类型

转载 作者:太空狗 更新时间:2023-10-30 00:57:57 25 4
gpt4 key购买 nike

假设您有两个整数集合:

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,这样对于出现在 col1col2 中的每个不同元素, col3 将包含该元素,其出现次数至少与该元素在 col1 或 col2 中的最大出现次数一样多,但不会更多。让我展示最终结果,然后进一步阐述:

   IEnumerable<int> col3=...;

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 时执行“标记和插入”类型的操作,从而生成一个最终字典,其中每个整数的计数刚好足够满足我的标准。

更新:保证输入集合已排序(即单调且非递减),并且生成的集合应按相同顺序排列。

最佳答案

像这样:

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()
)
));

关于c# - 执行两个 IEnumerable 集合的联合类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4008415/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com