嵌套字典LINQ中的过滤元素

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嵌套字典LINQ中的过滤元素相关的知识,希望对你有一定的参考价值。

我有以下数据结构:

Dictionary<string, Dictionary<string, List<int>>> data =
            new Dictionary<string, Dictionary<string, List<int>>>();

我想根据内部字典列表的第一个元素中的值过滤该字典中的一些元素。

for example:
{legion1
{soldier1, [10,1000]},
{soldier2, [50,1000]}
}

现在让我们说我想做foreach循环,其中只使用列表的第一个元素的值小于20的元素,foreach循环中的预期结果是:

{legion1{soldier1, [10,1000]}}

我尝试过的:

我做foreach循环然后我想使用类似的东西:

data.where(x => x.value.where(o => o[0] < 20 ))

我总是得到错误,这种方式是不正确的。

请告诉我如何解决问题以及我的方式失败的原因。

答案

您可以像这样过滤和迭代结果集:

var resultSet = 
         data.ToDictionary(e => e.Key, 
                              e => e.Value.Where(x => x.Value[0] < 20)
                                          .ToDictionary(k => k.Key, v => v.Value)
                          );

foreach(var item in resultSet){
    var key = item.Key; // string
    var values = item.Value; // Dictionary<string, List<int>>
    ...
    ...
}
另一答案

问题是您正在正确应用operator []。此外,既然你想同时使用LegionSoldier,你应该构造一个组合其中两个元组的元组:

foreach (var t in data.SelectMany(lg => lg.Value.Select(s => new {
    Legion = lg
,   Soldier = s
})).Where(ls => ls.Soldier.Value[0] < 20)) {
    Console.WriteLine("Legion={0} Soldier = {1}", t.Legion.Key, t.Soldier.Key);
}

以上是关于嵌套字典LINQ中的过滤元素的主要内容,如果未能解决你的问题,请参考以下文章

CSharp使用另一个列表及其嵌套列表过滤带有LINQ查询的列表

如何使用linq c#优化嵌套循环并从另一个列表中过滤

将一个嵌套字典中的选择项追加到另一个

如何使用 LINQ 过滤字典并将其返回到相同类型的字典

如何使用linq从字典中获取嵌套键值对[重复]

共享元素转换:活动到嵌套在另一个活动中的片段