访问linq方法中的字典值

时间:2015-03-02 18:13:18

标签: c# linq dictionary

我有以下结构:

public class Foo 
{
    public string Code { get; set; }
    public string Description { get; set; }
    public string Name { get; set; }
}

var fooMapping = GetFooMapping();
var fooObjects = GetFoos();

fooObjects.All(foo =>
{
    Tuple<string, string> value = null;
    if (fooMapping.TryGetValue(foo.Code, out value))
    {
        foo.Description = value.Item1;
        foo.Name = value.Item2;
    };
    return true;
});

GetFoos方法返回一个没有设置所有属性的Enoorable Foo对象。

GetFooMapping返回

IDictionary<string, Tuple<string, string>> 

其中TKey = Foo.Code和TValue.Item1 = Foo.Description和TValue.Item2 = Foo.Name。

在调试时,在运行最后几行代码后,我发现即使字典中存在Foo.Code,也没有设置某些属性。 我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

而不是All您可以使用Select并将结果分配回fooObjects

fooObjects = fooObjects.Select(foo =>
    {
        Tuple<string, string> value = null;
        if (fooMapping.TryGetValue(foo.Code, out value))
        {
            foo.Description = value.Item1;
            foo.Name = value.Item2;
        }
        return foo;
    });

您可能遇到的主要问题是All正在迭代正在生成项目的IEnumerable。然后,下次重复fooObjects时,它会再次生成它们,All中的更改将丢失。此外,这不是Linq的使用方式。 All用于检查集合上的谓词,而不是用于修改或投影。

另一个选择是确保您使用列表并使用foreach

var fooObjects = GetFoos().ToList();

foreach(var foo in fooObjects)
{
    Tuple<string, string> value = null;
    if (fooMapping.TryGetValue(foo.Code, out value))
    {
        foo.Description = value.Item1;
        foo.Name = value.Item2;
    }
}