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

Массив строк входит в контроллер нормально:

string[] values = new string[] {"123", "Pie", "456", "Cake"};

Мне нужно преобразовать его в словарь:

Dictionary<int,string> Deserts = new     Dictionary<int,string>() { {123, "Pie"}, {456, "Cake"} };

Я устал:

values.ToDictionary(v => int.Parse(v), v => values.IndexOf(v) + 1);

Но это дает ошибку во время выполнения. Индекс не найден.

2
toddmo 23 Мар 2017 в 23:09

2 ответа

Лучший ответ

Используя цикл for

var deserts = new Dictionary<int,string>();
for (var i = 0; i < values.Length; i += 2) {
    deserts.Add(int.Parse(values[i]), values[i+1]);
}
3
Gonzalo.- 23 Мар 2017 в 20:13

Простой цикл подойдет (и я лично сделал бы это таким образом), но если вы хотите использовать LINQ, вы можете использовать Windowed из библиотеки moreLINQ. Это будет выглядеть примерно так:

values.Windowed(2).ToDictionary(v => int.Parse(v.First()), v => v.Last());

Вы также можете обойтись без этого с Select + GroupBy:

values.Select((Value, Index) => { Value, Index })
      .GroupBy(x => x.Index / 2)
      .ToDictionary(g => int.Parse(g.First().Value), g => g.Last().Value);

Я бы не назвал это элегантным.

1
MarcinJuraszek 23 Мар 2017 в 20:31