代码之家  ›  专栏  ›  技术社区  ›  Marko

在linq分组上克隆对象-复制构造函数替换

  •  1
  • Marko  · 技术社区  · 15 年前

    我有一个自定义对象(资产)的集合,我想用LINQ对它们进行分组。 自定义对象具有标准属性,如id、名称和成本属性。

    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()
                     }
    

    我试着从一个链接中使用克隆技巧:

    Deep cloning objects

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

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

    1 回复  |  直到 9 年前
        1
  •  2
  •   VinayC    15 年前

    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()
                 })