Перемещение через объект словаря
Я очень новичок в .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
и получить значения словаря и распечатать их в представлении?
Ответы
Ответ 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});
}
}