Допустим, у вас есть список Person
объектов и вы хотите сделать из него Dictionary<int, string>
, чтобы иметь возможность искать имя человека по его SSN или как-то еще.
С ToDictionary
методом это просто:
var dictionary = Persons.ToDictionary(p => p.SSN, p => p.Name);
Альтернатива - создать словарь и затем использовать цикл foreach
:
var dictionary = new Dictionary<int, string>();
foreach (Person p in Persons) {
dictionary.Add(p.SSN, p.Name);
}
Что-то вроде многословно и скрывает намерение.
Вы можете использовать ToDictionary
, но без лямбда-выражений:
var dictionary = Persons.ToDictionary(GetPersonKey, GetPersonValue);
//....
int GetPersonKey(Person p) {
return p.SSN;
}
string GetPersonValue(Person p) {
return p.Name;
}
что явно не так кратко.
Вы можете пойти с анонимными делегатами:
var dictionary = Persons.ToDictionary(delegate(Person p) { return p.SSN; },
delegate(Person p) { return p.Name; });
но это не сравнится с лямбда-выражениями в краткости.
Я бы не хотел использовать какие-либо методы расширения LINQ, если бы лямбда-выражения не были реализованы в языке, потому что это потребовало бы большого количества ненужного кода.