У меня есть список

List<string> sList = new List<string>() { "a","b","c"};

И в настоящее время я выделяю это в словарь следующей структуры:

//(1,a)(2,b)(3,c)
Dictionary<int, string> dResult = new Dictionary<int, string>();
for(int i=0;i< sList.Count;i++)
{
    dResult.Add(i, sList[i]);
}

Но с Linq я видел более тонкий способ, например ToDictionary((x,index) =>

Как правильный синтаксис или как это решить в одной строке?

11
c0rd 8 Сен 2016 в 11:36

4 ответа

Лучший ответ

Вы можете использовать перегрузку Select, которая проецирует индекс для заполнения анонимного типа:

Dictionary<int, string> dResult = sList
    .Select((s, index) => new { s, index })
    .ToDictionary(x => x.index, x => x.s);

Это то же самое, что и ваш код. Если вместо этого вы хотите получить результат, который вы прокомментировали: (1,a)(2,b)(3,c)), вы должны добавить +1, так что ToDictionary(x => x.index+1, x => x.s).

15
Cœur 12 Фев 2017 в 15:34

Не существует метода ToDictionary, который давал бы это за один вызов, поскольку нет перегрузок, предоставляющих индекс, но вы можете использовать перегрузку Select, которая принимает Func<T, int, TResult>:

var dictionary = list.Select((value, index) => new { value, index })
                     .ToDictionary(pair => pair.index, pair => pair.value);

Или в C # 7, избегая создания группы объектов, размещенных в куче, используя ValueTuple:

var dictionary = list.Select((v, i) => (value: v, index: i))
                     .ToDictionary(pair => pair.index, pair => pair.value);

Начиная с версии C # 7.1, вы можете использовать логическое выражение ValueTuple:

var dictionary = list.Select((value, index) => (value, index))
                     .ToDictionary(pair => pair.index, pair => pair.value);

(Как отметил Тим, вам нужно изменить индекс на 1, чтобы получить исходный запрошенный результат.)

9
David Pine 21 Сен 2017 в 19:06

Вы также можете использовать этот подход без анонимного типа:

Dictionary<int, string> dResult = Enumerable
    .Range(0, sList.Count())
    .ToDictionary(i => i + 1, i => sList[i]);
3
Vitaly Maximov 8 Сен 2016 в 10:00