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那么它会将它添加到字典中会有什么好处。
答案 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()
调用之前,您可以有几个条件,以防您想要排除字典中已有的值。