Как заполнить словарь с помощью LINQ?
public class Person
{
public string Email {get; set;}
public string Name {get; set;}
}
public Report : Dictionary<string, string>
{
public Report()
{
List<Person> list = getData(); // filled with Person's
var realList = list.Where(x => x.Name != "test");
foreach( var i in realList)
{
this.Add(i.Email,i.Name);
}
}
}
Я попытался упростить свой код, чтобы перейти к вопросу. В основном у меня есть список людей, и я хочу получить под-список этого, а затем для каждого элемента в под-списке я хочу добавить его в этот словарь, который является классом.
Мой вопрос: есть ли способ избавиться от этого утверждения foreach и достичь того же эффекта с помощью приведенного выше утверждения linq. Потому что мне кажется глупым проходить через список один раз, а затем через подсписок. Так что же было бы хорошо, если бы во время выполнения оператора linq if x.Name не равно тесту, то он добавляет его в словарь.
2 ответов:
Мой вопрос: есть ли способ избавиться от этого утверждения foreach и достичь того же эффекта с помощью приведенного выше утверждения linq. Потому что мне кажется глупым проходить через список дважды
Вы не проходите список дважды в коде-список перечисляется только один раз, так как LINQ использует отложенное выполнение. Это, вероятно, лучший способ достичь этого.
Однако, если вы не подклассировали словарь, а инкапсулировали его, вы можете использовать
ToDictionaryдля создания инкапсулированный словарь:List<Person> list = getData(); // filled with Person's Dictionary<string,string> people = list .Where(x => x.Name != "test") .ToDictionary(x => x.Email, x => x.Name);
Хотя здесь уже есть несколько хороших ответов о том, как преобразовать ваш список непосредственно в словарь, они на самом деле не отвечают на исходный вопрос, , потому что вы не можете повторно назначить переменную
this(для классов она доступна только для чтения в C#), и вам придется перебирать вновь созданный словарь, чтобы добавить элементы из него в свой словарьthis.Обычно я решаю эту проблему, материализуя выражение LINQ в список и используя метод
ForEach()списка (который также принимает лямбда-выражения) для заполнения другой структуры.Вот пример кода:
list .Where(x => x.Name != "test") // your condition .ToList() // turns expression to list .ForEach(a => this.Add(a.Email, a.Name)); // populating dictionaryПеред вызовом
ToList()можно задать несколько условий, на случай если вы хотите исключить значения, которые уже есть в словаре.
Comments