在 C# 中跨多个列表查找和计算公共列表元素

N.M*_*ORR -3 c#

所以我有一组列表,没有关于我有多少列表的固定数量。

List1 = {"a", "b", "c", "d"}
List2 = {"b", "c", "d", "e"}
List3 = {"c", "d", "e", "f"}
.
.
.
Listn = {"g", "e", "a", "c"}
Run Code Online (Sandbox Code Playgroud)

每个列表将包含唯一的项目,单个列表的长度可以在 20 - 30 个项目范围内。我将所有列表存储在另一个列表中以允许 n 个列表。

ListOfLists = {List1, List2, List3, ..., Listn}
Run Code Online (Sandbox Code Playgroud)

就使用最少的处理能力而言,生成包含 ListOfLists 中包含的所有唯一项及其出现次数的列表或数组的最佳方法是什么?

在输出方面,我认为最好的选择是包含项目及其出现次数的数组列表。

UniqueListItems = { {"a", 12}, {"b" ,3}, {"c", 18}, {"d", 15}, {"e", 5} }
Run Code Online (Sandbox Code Playgroud)

最终,我想按项目出现对列表进行排序,并按降序显示项目。

Output:
c
d
a
e
b
Run Code Online (Sandbox Code Playgroud)

我曾尝试使用多个嵌套的 for 和 foreach 循环来执行此操作,但结果是一些相当笨重的代码。限制因素之一是我发现的唯一列出操作的列表最多可使用 2 个列表,而不是 n 个列表。

有没有在内置的 C# 列表操作中使用 n 个列表的方法?如果没有,处理这个问题的最佳方法是什么?

use*_*994 5

您可以Linq在此处使用方法,如下面的代码所示。

var uniqueListItems  = ListOfLists.SelectMany(l => l)
    .GroupBy(l => l)
    .Select(l => new {Key = l.Key, Count = l.Count()})
    .OrderByDescending(o => o.Count);
Run Code Online (Sandbox Code Playgroud)

上面的代码用于SelectMany展平列表和结果,查询应用GroupBy来计算计数。

您可以在此 dotnet fiddle - https://dotnetfiddle.net/VsByaj 上查看示例代码