C#: «Система.Коллекции.Универсальный.Словарь.Коллекция ключей «не содержит определения для «ToList»» ошибка

#c# #dictionary #generics #tostring

Вопрос:

У меня есть следующий код, который пытается получить значения в словаре, и, похоже, он не работает.

 using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json.Linq;

namespace DemoTests
{
    class Program
    {
        static void Main(string[] args)
        {
            string jsonString = "{"Name":"Bob Smith","mainTitle":"Title1","emailList":["test.e@example.com"],"rowCount":"4","emailSubject":"Test Email","items":{"sheets":[[{"ID": "4564342", "start": "08:00"}]]}}";
            JObject jsonObj = JObject.Parse(jsonString);
            Dictionary<dynamic, dynamic> results = jsonObj.ToObject<Dictionary<dynamic, dynamic>>();
  
            List<dynamic> subList = results["items"]["sheets"].ToObject<List<dynamic>>();
            foreach (dynamic tableEntries in subList) 
            {
                var entryDict = tableEntries[0].ToObject<Dictionary<dynamic, dynamic>>();
                for (int k = 0; k < entryDict.Keys.Count; k  )
                {
                    String key = entryDict.Keys.ToList()[k];
                    Console.WriteLine(key);
                }
            }
      
            }

    }
}
 

Я получаю сообщение об ошибке в сети String key = entryDict.Keys.ToList()[k];

Exception thrown: 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' in System.Linq.Expressions.dll An unhandled exception of type 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' occurred in System.Linq.Expressions.dll 'System.Collections.Generic.Dictionary<object,object>.KeyCollection' does not contain a definition for 'ToList'

Как я могу запустить его? Я довольно новичок в C#, поэтому также открыт для лучших способов написания моего кода

Комментарии:

1. Возможно, было бы лучше просто использовать JObject уже проанализированные вами, а не все эти словари

2. @CamiloTerevinto Понял. Изучим объект работы немного подробнее. Сначала я изо всех сил пытался получить из него список ключей и в итоге просто преобразовал его в словарь

Ответ №1:

В сообщении об ошибке говорится, что entryDict.Ключи не имеют функции ToList() То.Ключи — это коллекция ключей, для просмотра которой используется перечислитель. Вы не можете использовать его как массив/список.

Чего ты хочешь, так это:

 foreach (var key in results.Keys)
{
    Console.WriteLine(key.ToString());
}
 

Комментарии:

1. Это прекрасное решение, но вы не объяснили причину ошибки. И вы также утверждаете то, что не соответствует действительности. Причина, по которой это не удается, заключается в том, что вы не можете вызвать метод расширения для динамического выражения. Другими словами, Keys действительно есть ToList метод, но это метод расширения

Ответ №2:

создайте список с помощью конструктора

 List<string> keyList = new List<string>(entryDict.Keys);
for (int k = 0; k < entryDict.Keys.Count; k  ){
    String key = keysList[k];
    Console.WriteLine(key);
}
 

Комментарии:

1. это привело к ошибке The best overloaded method match for 'System.Collections.Generic.List<string>.List(int)' has some invalid arguments