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

本文关键字:单个 属性 选择 如何 | 更新日期: 2023-09-27 18:33:59

我从以下语句开始。

return part
  .Descendants("DataMapping")
  .Select(element=>serializer.Deserialize(element.CreateReader()) as Mapping);

然后,事实证明映射中的属性不是通过序列化程序设置的,所以我不得不手动更新它。幸运的是,它始终是相同的值,因此以下内容解决了我的问题。

return part
  .Descendants("DataMapping")
  .Select(element => serializer.Deserialize(element.CreateReader()) as Mapping)
  .Select(element => new Mapping(element, "blopp"));

但是,我无法停止认为这是一个糟糕的设计。首先,我正在创建两次对象。此外,我必须添加一个自定义构造函数,这增加了代码库的复杂性。

我还没有找到任何像.ForEach(e=>e.X = ":)",我想知道是否有可能通过可序列化创建的对象进行 LINQ 并同时设置字段的值。

我希望表达式的行为类似于以下示例所示。我不能使用第二个 Select(),因为那样它会生成一个字符串类型的数组,我需要保留原始类型,只会稍微影响其属性。

return part
  .Descendants("DataMapping")
  .Select(element => serializer.Deserialize(element.CreateReader()) as Mapping)
  .SomeCommand(element => element.Extra = "blopp"));

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

您始终可以使用表达式 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");