嵌套字典LINQ中的过滤元素

时间:2018-03-04 21:23:59

标签: linq dictionary nested

我有以下数据结构:

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

我总是得到那种错误的错误。

请告诉我如何解决问题以及为什么我的方式失败。

2 个答案:

答案 0 :(得分:1)

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

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>>
    ...
    ...
}

答案 1 :(得分:0)

问题在于您错误地应用了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);
}