Как заполнить словарь с помощью 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 не равно тесту, то он добавляет его в словарь.

722   2  

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

    Ничего не найдено.