如何使用LINQ填充字典?

时间:2014-07-03 18:16:07

标签: c# .net linq dictionary

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语句中如果x.Name不等于test那么它会将它添加到字典中会有什么好处。

2 个答案:

答案 0 :(得分:16)

  

我的问题:有没有办法摆脱那个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);

答案 1 :(得分:0)

即使这里有一些很好的答案如何将列表直接转换为字典,但它们并没有真正回答原始问题,因为您无法重新分配this变量(对于C#中只读的类),您必须迭代新创建的字典,将其中的元素添加到this字典中。

我通常通过将LINQ表达式实现为List并使用列表的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()调用之前,您可以有几个条件,以防您想要排除字典中已有的值。