如何使用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,那么它将把它添加到字典中,那该怎么办呢?
我的问题是:有没有一种方法可以摆脱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()
调用之前可以有几个条件,以防您想要排除字典中已经存在的值。