gpt4 book ai didi

c# - 大多数列表共有的项目

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

给定一个列表列表(假设有 5 个列表,要有一个可用的实数),我可以使用以下代码:

var list1 = new List<int>() { 1, 2, 3 };
var list2 = new List<int>() { 2, 3, 4 };
var list3 = new List<int>() { 3, 4, 5 };
var listOfLists = new List<List<int>>() { list1, list2, list3 };
var intersection = listOfLists.Aggregate((previousList, nextList) => previousList.Intersect(nextList).ToList());

现在假设 intersection 最终包含 0 个项目。很可能有些对象是 4/5 列表共有的。我将如何以最有效的方式找到它们?

我知道我可以遍历 4 个列表的所有组合并保存所有结果,但该方法的扩展性不是很好(这最终必须在大约 40 个列表上完成)。

如果没有项目是 4 个列表共有的,那么将重复搜索以查找 3/5 列表共有的项目,等等。从视觉上看,这可以用网格点列表来表示,我们正在搜索那些点重叠最多。

有什么想法吗?

编辑:也许最好查看每个点并跟踪它在每个列表中出现的次数,然后创建一个出现次数最多的点列表?

最佳答案

您可以从所有列表中选择所有数字(点),并按值对它们进行分组。然后按组大小对结果进行排序(即列出计数点所在的位置)并选择最常见的项目:

var mostCommon = listOfLists.SelectMany(l => l)
.GroupBy(i => i)
.OrderByDescending(g => g.Count())
.Select(g => g.Key)
.First();
// outputs 3

您可以通过将 First() 替换为 Take(N) 来获取多个顶部项目,而不是只获取第一个项目。


返回带有列表数量的项目(按列表数量排序):

var mostCommonItems = from l in listOfLists
from i in l
group i by i into g
orderby g.Count() descending
select new {
Item = g.Key,
NumberOfLists = g.Count()
};

用法(item 是一个强类型的匿名对象):

var topItem = mostCommonItems.First();
var item = topItem.Item;
var listsCount = topItem.NumberOfLists;

foreach(var item in mostCommonItems.Take(3))
// iterate over top three items

关于c# - 大多数列表共有的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17703573/

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