我从以下声明开始。
return part
.Descendants("DataMapping")
.Select(element=>serializer.Deserialize(element.CreateReader()) as Mapping);
然后,事实证明 Mapping 中的属性不是通过序列化程序设置的,因此我必须手动更新它。幸运的是,它始终具有相同的价值,因此以下解决了我的问题。
return part
.Descendants("DataMapping")
.Select(element => serializer.Deserialize(element.CreateReader()) as Mapping)
.Select(element => new Mapping(element, "blopp"));
然而,我不能再认为这是一个糟糕的设计。我开始两次创建一个对象。此外,我不得不添加一个自定义构造函数,增加了代码库的复杂性。
我还没有找到任何方法,例如 .ForEach(e => eX =" :)" 我想知道它是否完全没有可以通过可串行创建的对象LINQ并同时设置字段的值。
我希望表达式的行为类似于下面的示例所示。我无法使用第二个 Select(),因为它会生成一个 String 类型的数组,我需要保留原始类型,只是略有影响其财产。
return part
.Descendants("DataMapping")
.Select(element => serializer.Deserialize(element.CreateReader()) as Mapping)
.SomeCommand(element => element.Extra = "blopp"));
答案 0 :(得分:1)
你总是可以使用语句lambda ,其中表达式lambda 并不适合你的需要:
return part
.Descendants("DataMapping")
.Select(element =>
{
var obj =serializer.Deserialize(element.CreateReader()) as Mapping);
obj.Extra = "blopp";
return obj;
});
另一种方法是创建一个列表并使用ForEach
方法:
return part
.Descendants("DataMapping")
.Select(element => serializer.Deserialize(element.CreateReader()) as Mapping)
.ToList()
.ForEach(element => element.Extra = "blopp");