Подтвердить что ты не робот

Перемещение через объект словаря

Я очень новичок в .NET, привыкший работать в PHP. Мне нужно перебирать через foreach через словарь объектов. Моя настройка - это приложение MVC4.

Модель выглядит следующим образом:

public class TestModels
{
    Dictionary<int, dynamic> sp = new Dictionary<int, dynamic>
    {
        {1, new {name="abc", age="1"}},
        {2, new {name="def", age="2"}}
    }
}

Контроллер:

public class TestController : Controller
{
   Models.TestModels obj = new Models.TestModels();
}

Как выполнить цикл через объект obj и получить значения словаря и распечатать их в представлении?

4b9b3361

Ответ 1

Один из способов - прокрутить ключи словаря, которые я рекомендую:

foreach(int key in sp.Keys)
    dynamic value = sp[key];

Другим способом является цикл через словарь как последовательность пар:

foreach(KeyValuePair<int, dynamic> pair in sp)
{
    int key = pair.Key;
    dynamic value = pair.Value;
}

Я рекомендую первый подход, потому что вы можете больше контролировать порядок получаемых элементов, если вы украшаете свойство Keys соответствующими операторами LINQ, например, sp.Keys.OrderBy(x => x) помогает вам извлекать элементы в порядке возрастания ключа, Обратите внимание, что Dictionary использует внутреннюю структуру данных хеш-таблицу, поэтому, если вы используете второй метод, порядок элементов нелегко предсказуем.

Обновление (01 декабря 2016 г.): заменил var на фактические типы, чтобы сделать ответ более понятным.

Ответ 2

Это зависит от того, что вам нужно в Словаре

Models.TestModels obj = new Models.TestModels();

foreach (var keyValuPair in obj.sp)
{
    // KeyValuePair<int, dynamic>
}

foreach (var key in obj.sp.Keys)
{
     // Int 
}

foreach (var value in obj.sp.Values)
{
    // dynamic
}

Ответ 3

Вы можете сделать это следующим образом.

Models.TestModels obj = new Models.TestModels();
foreach (var item in obj.sp)
{
    Console.Write(item.Key);
    Console.Write(item.Value.name);
    Console.Write(item.Value.age);
}

Проблема, с которой вы, скорее всего, сейчас имеете право, состоит в том, что коллекция private. Если вы добавите public в начало этой строки

Dictionary<int, dynamic> sp = new Dictionary<int, dynamic> 

Вы должны иметь доступ к нему из функции внутри вашего контроллера.

Изменить: добавление функционального примера полной реализации TestModels.

Ваш класс TestModels должен выглядеть примерно так.

public class TestModels
{
    public Dictionary<int, dynamic> sp = new Dictionary<int, dynamic>();

    public TestModels()
    {
        sp.Add(0, new {name="Test One", age=5});
        sp.Add(1, new {name="Test Two", age=7});
    }
}

Вероятно, вы захотите прочитать ключевое слово dynamic.

Ответ 4

public class TestModels
{
    public Dictionary<int, dynamic> sp = new Dictionary<int, dynamic>();

    public TestModels()
    {
        sp.Add(0, new {name="Test One", age=5});
        sp.Add(1, new {name="Test Two", age=7});
    }
}