如何。选择()并同时更改单个属性?

时间:2014-12-11 09:30:11

标签: c# linq serialization properties

我从以下声明开始。

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"));

1 个答案:

答案 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");