如何使用LINQ填充字典

本文关键字:字典 填充 LINQ 何使用 | 更新日期: 2023-09-27 18:11:17

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);
         }
     }
}

我试着简化我的代码来解决问题。我有一个person列表,我想获得它的子列表然后对于子列表中的每个元素,我想将它添加到这个字典,也就是类。

我的问题是:有没有一种方法可以摆脱foreach语句并达到与上面linq语句相同的效果?因为我觉得先遍历一次列表然后遍历子列表很傻。那么,如果在linq语句中,如果x.Name不等于test,那么它将把它添加到字典中,那该怎么办呢?

如何使用LINQ填充字典

我的问题是:有没有一种方法可以摆脱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()方法(也接受lambda表达式)来填充另一个结构来解决这个问题。

示例代码:

     list
        .Where(x => x.Name != "test")             // your condition
        .ToList()                                 // turns expression to list
        .ForEach(a => this.Add(a.Email, a.Name)); // populating dictionary

ToList()调用之前可以有几个条件,以防您想要排除字典中已经存在的值。