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

Rom*_*man 0 .net c# .net-core

我有这种数据类型:

Dictionary<string, List<Dictionary<string, List<Dictionary<string, List<Dictionary<string, string>>>>>>>
Run Code Online (Sandbox Code Playgroud)

每当我试图到达它的最底部来计算一些东西时,我就会遇到一个错误,我无法在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]
Run Code Online (Sandbox Code Playgroud)

这是循环的一部分:

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)
Run Code Online (Sandbox Code Playgroud)

现在真的很好,如果有更好的方法来处理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());
                }
            }
            //
        }
        //
Run Code Online (Sandbox Code Playgroud)

Joe*_*orn 7

外循环看起来像这样:

foreach (var type_element in device)
Run Code Online (Sandbox Code Playgroud)

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

也许你想要的是这个:

foreach (var type_element in device)
{   
    foreach (var group_element in type_element.Values)
Run Code Online (Sandbox Code Playgroud)

在这里,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)
                 {
                      //...
Run Code Online (Sandbox Code Playgroud)

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

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

也许你正试图将Python习语,尤其是关联对象语法(item["property"])转换为.Net.这是个错误..Net并不真正做关联对象.您想要为此实际定义一个.

  • 现在应该准确. (2认同)