1

我有我想与 LINQ 分组的自定义对象(资产)的集合。自定义对象具有标准属性,如 id、name 和 cost 属性。分组时我想计算每个组的成本,所以我使用了这样的小技巧:

from a in assets
group a by a.AssetId into ga
select new Asset()
                 {
                    AssetId = ga.Key,
                    Cost = ga.Select(gg=>gg.Cost).Sum()
                 }

好的,这里一切都很好。但是...为了也初始化订单属性,我同时使用复制构造函数和成本计算...

from a in assets
group a by a.AssetId into ga
select new Asset(ga.FirstOrDefault())
                 {
                    AssetId = ga.Key,
                    Cost = ga.Select(gg=>gg.Cost).Sum()
                 }

所以现在,我通过 id 获取分组资产的集合,所有属性都从组中的第一个资产复制,并计算出分组成本。但是......为了做到这一点,我需要为使用这种分组的每个对象编写一个具有“所有属性初始化”的复制构造函数,在我的情况下这是开销,因为有具有 20 多个属性的对象。

我尝试使用链接中的克隆技巧:

深度克隆对象

在 linq 组查询中但没有成功。

我的问题:有没有更好/更优雅的方式来实现这一点?

谢谢

4

1 回答 1

2

如果您不需要深拷贝它们,您可以使用 MemberwiseClone 方法。实现(来自 Object 类)& 给你一个浅拷贝。所以线new Asset(ga.FirstOrDefault()) 会变成((Asset)(ga.FirstOrDefault().MemberwiseClone()))。但是,作为浅拷贝,[First Asset].SomeObject 将指向 [Grouped Asset].SomeObject 并且从一个更改将反映在另一个上。

编辑以包含注释中描述的辅助方法:

static T CloneAndUpdate<T>(T t, Action<T> updater) where T: class
{
T clone = null; // Use reflection/serialization to create shallow/deep clone
updater(clone);
return clone;
}

现在,您可以使用以下方法:

select Utility.CloneAndUpdate(ga.FirstOrDefault(), a =>
             {
                AssetId = ga.Key,
                Cost = ga.Select(gg=>gg.Cost).Sum()
             })
于 2010-08-11T10:07:24.210 回答