嵌套字典LINQ中的过滤元素

问题描述 投票:2回答:2

我有以下数据结构:

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

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

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

linq dictionary nested
2个回答
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>>
    ...
    ...
}

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.