- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
给定一个列表列表(假设有 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/
我有一个包含 28 列的数据库。第一列是代码,第二列是名称,其余是值。 public void displayData() { con.Open(); MySqlDataAdapter
Redmi 官方今天宣布了 Redmi智能电视 A 系列新品,称即将开放预约。 官方并未公布 Redmi智能电视 A 系列新品的具体信息,但给出的海报显示该系列提供五种尺寸:32 英寸、43
我是一名优秀的程序员,十分优秀!