2010-08-11 47 views
1

我有我想用LINQ進行分組的自定義對象(資產)的集合。自定義對象具有標準屬性,如id,名稱和成本屬性。 分組時我要計算每個組的成本,所以我用小動作像這樣:在linq分組上覆制對象 - 複製構造函數替換

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

好了,一切都在這裏很好。但是......爲了初始化爲了性能,以及,我使用拷貝構造器和成本計算在一起......

​​

所以現在,我通過ID獲得分組資產的集合,所有屬性從複製計算分組成本的組中的第一項資產。但是...爲了做到這一點,我需要爲使用這種分組的每個對象編寫一個帶有「全部屬性初始化」的複製構造函數,在我的情況下這是開銷,因爲有20+屬性的對象。

我試着使用克隆伎倆從鏈接:

在LINQ

Deep cloning objects

組查詢,但沒有成功。

我的問題:是否有更好/更優雅的方式來實現這一目標?

謝謝

回答

2

如果您不需要深拷貝它們,您可以使用MemberwiseClone方法。該實現(來自對象類)&給你一個淺拷貝。所以行new Asset(ga.FirstOrDefault()) 將變成((Asset)(ga.FirstOrDefault().MemberwiseClone()))。 但是,如果是淺拷貝,[First Asset] .SomeObject將指向[分組資產] .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() 
      }) 
+0

糟糕!我注意到你想使用對象初始化器 - 不知道他們是否可以在使用構造函數的資產實例上工作。 – VinayC 2010-08-11 10:12:15

+0

我能想到的唯一方法是添加使用MemberwiseClone()的拷貝構造函數 - 這將至少減少編寫拷貝構造函數的時間。 另一種方式是寫一個靜態方法如 - 靜態ŤCloneAndUpdate (T噸,動作更新)其中,T:類 { Ť克隆= ...;/*使用反射/序列化來創建克隆*/ 更新程序(克隆); return clone; }然後將其用作---- select Utility.CloneAndUpdate(ga.FirstOrDefault(),a => {AssetId = ga.Key, Cost = ga.Select(gg => gg.Cost).Sum( ) }) – VinayC 2010-08-11 10:35:43

+0

是的,多數民衆贊成我的問題..謝謝反正,很好的答案 – Marko 2010-08-11 10:36:07