【问题标题】:filter elements in nested dictionary LINQ过滤嵌套字典LINQ中的元素
【发布时间】:2018-03-04 21:23:59
【问题描述】:

我有以下数据结构:

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


    【解决方案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>>
        ...
        ...
    }
    

    【讨论】:

    • @Georgi 我误读了您的要求。现在一切都应该如你所愿。 ;)
    • 哦,这太棒了@Aominè。这是更清洁的方式。再次感谢!
    【解决方案2】:

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

    【讨论】:

    • 我也尝试了该解决方案,但由于该匿名类型的返回结果,我猜我在 foreach 中获得了更多元素。我们是否有可能改变一些东西,以便也可以使用解决方案?
    • 我想我弄错了。我明天再试一次并再次提供反馈。
    • @Georgi 这种方法逐一列举士兵,而不是军团。每个士兵的军团都通过一个匿名类型的实例与之关联。
    猜你喜欢
    • 2022-07-13
    • 2021-06-22
    • 2020-02-29
    • 2021-09-19
    • 2018-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多