为什么我的自定义数据类型会继续在C#中转换为KeyValuePair?

时间:2018-02-14 16:32:18

标签: c# .net .net-core

我有这种数据类型:

Dictionary<string, List<Dictionary<string, List<Dictionary<string, List<Dictionary<string, string>>>>>>>

每当我试图触及它的最底部以计算其中的一些东西时,我有一个错误,我无法在KeyValuePairs上使用 foreach

foreach statement cannot operate on variables of type 'KeyValuePair<string, List<Dictionary<string, List<Dictionary<string, string>>>>>' because 'KeyValuePair<string, List<Dictionary<string, List<Dictionary<string, string>>>>>' does not contain a public definition for 'GetEnumerator' [RestService]

这是循环的一部分:

void GetMetricsCount(List<Dictionary<string, List<Dictionary<string, List<Dictionary<string, string>>>>>> device, Dictionary<string, string> results_holder)
        {
            // count all metrics
            foreach (var type_element in device)
            {   
                foreach (var group_element in type_element)
                {   
                    foreach (var wtf in group_element)

现在真的很好,如果有更好的方法来处理C#中那种复杂的数据结构,我真的很感激,如果有人告诉我怎么样,因为这很糟糕!

更新: 我很抱歉,但我在这里复制了一些代码。 以下是对不匹配类型的挫折的答案:

        // Get overview of metrics for last 24h
    public Dictionary<string, Dictionary<string, string>> GetMetricsOverview()
    {
        var overview_results = new Dictionary<string, Dictionary<string, string>>();

        // get total item count for each metric group and add to holder
        void GetMetricsCount(List<Dictionary<string, List<Dictionary<string, List<Dictionary<string, string>>>>>> device, Dictionary<string, string> results_holder)
        {
            // count all metrics
            foreach (var type_element in device)
            {   
                foreach (var group_element in type_element.Values)
                {   
                    foreach (var wtf in group_element)
                    results_holder.Add(group_element.Key + "_count", group_element.Value.Count.ToString());
                }
            }
            //
        }
        //

1 个答案:

答案 0 :(得分:7)

外部循环如下所示:

foreach (var type_element in device)

通过此循环,type_element变量是Dictionary<string, List<Dictionary<...>>>引用。听起来你希望跳过一个级别并直接进入下一个List<Dictionary<...>>

也许你想要的是这个:

foreach (var type_element in device)
{   
    foreach (var group_element in type_element.Values)

此处,type_element.Values仍然是列表的集合,因此group_element变量仍为List<Dictionary<string, List<Dictionary<string, string>>>>

为了完整起见,这意味着您下一级的wtf变量仍然是Dictionary<string, List<Dictionary<string, string>>> ...如果您考虑的话,这有点疯狂;变量绝对符合它的名字。你确定你不想定义一两个类来获得这些数据的编译时类型安全吗?

要想到最里面的词典,你需要这个:

foreach (var type_element in device)
{ 
    foreach (var type_lists in type_element.Values)
    {   
        foreach(var group_element in type_lists)
        {
            foreach(var group_lists in group_element.Values)
            {
                 foreach (var wtf in group_lists.Values)
                 {
                      //...

Dictionary<string, string>变量的最终结果为wtf。但是又一次......整件事情有点荒谬。看起来有点像你正在尝试使用字典重新创建一个完美的类型系统。

您可能还想查看SelectMany()方法,它可以帮助减少和简化此代码。

也许你正在尝试将Python习语,特别是关联对象语法(item["property"])变成.Net。这是个错误。 .Net并不真正做关联对象。您希望为此实际定义