如何.选择() 并同时更改单个属性
本文关键字:单个 属性 选择 如何 | 更新日期: 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");