我有以下结构:
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,也没有设置某些属性。 我错过了什么吗?
答案 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;
}
}