Looking for .net Keywords? Try Ask4Keywords

.NET Framework ToDictionary


пример

Возвращает новый словарь из исходного IEnumerable используя предоставленную функцию keySelector для определения ключей. Выбросит ArgumentException если keySelector не является инъективным (возвращает уникальное значение для каждого члена исходной коллекции). Существуют перегрузки, которые позволяют указывать значение, которое нужно сохранить, а также ключ.

var persons = new[] {
    new { Name="Fizz", Id=1},
    new { Name="Buzz", Id=2},
    new { Name="Foo", Id=3},
    new { Name="Bar", Id=4},
};

Указание только функции выбора ключа создаст Dictionary<TKey,TVal> с TKey return Тип селектора клавиш, TVal - исходный тип объекта, а исходный объект - как сохраненное значение.

var personsById = persons.ToDictionary(p => p.Id);
// personsById is a Dictionary<int,object>

Console.WriteLine(personsById[1].Name); //Fizz
Console.WriteLine(personsById[2].Name); //Buzz

Указание функции селектора значений также приведет к созданию Dictionary<TKey,TVal> когда TKey прежнему является типом возврата селектора клавиш, но TVal теперь возвращает тип функции выбора значения и возвращаемое значение в качестве хранимого значения.

var namesById = persons.ToDictionary(p => p.Id, p => p.Name);
//namesById is a Dictionary<int,string>

Console.WriteLine(namesById[3]); //Foo
Console.WriteLine(namesById[4]); //Bar

Как указано выше, ключи, возвращаемые селектором ключей, должны быть уникальными. Следующее выдает исключение.

var persons = new[] {
    new { Name="Fizz", Id=1},
    new { Name="Buzz", Id=2},
    new { Name="Foo", Id=3},
    new { Name="Bar", Id=4},
    new { Name="Oops", Id=4}
};

var willThrowException = persons.ToDictionary(p => p.Id)

Если уникальный уникальный ключ не может быть предоставлен для исходной коллекции, попробуйте вместо этого использовать ToLookup. На первый взгляд, ToLookup ведет себя аналогично ToDictionary, однако в полученном Lookup каждый ключ сопряжен с набором значений с соответствующими ключами.