2010-02-10 18 views
2

我一直在嘗試使用基於表達式的方式編寫以下代碼,但不知道如何在比較後對對象執行該賦值。任何幫助將不勝感激。如何在Linq語句中轉換並分配正確的值

var pcs = from a in collection 
     group a by a.TotType 
     into g 
     select new 
     { 
      TType = g.Key, 
      SColl = g.Select(r => r) 
    }; 

for (int i = 0; i < processResult.PAndLReport.BreakdownTotTypeCollection.Count; i++) 
{ 
    foreach (var ttypes in pcs) 
    { 
    if (processResult.PAndLReport.BreakdownTotTypeCollection[i].TotType == ttypes.TType) 
    { 
     BreakdownCollection coll = new BreakdownCollection(); 
     foreach (var item1 in ttypes.SColl) 
     { 
     coll.Add(item1); 
     } 

     processResult.PAndLReport.BreakdownTotTypeCollection[i].BreakdownCollection = coll; 
    } 
    } 
} 
+0

請問您能解釋一些嗎?是否在條件比較類型之後查看BreakdownCollection的分配 – 2010-02-12 03:19:33

回答

1

所以 - 代碼工作,但它非常詳細。

這是刺激減少代碼。我做了一些假設(這段代碼與其他代碼不完全一樣),但它可能接近你想要的。

var pcs = collection.ToLookup(a => a.TotType); 

foreach(var bttcoll in processResult 
    .PAndLReport 
    .BreakdownTotTypeCollection) 
{ 
    var items = pcs[bttcoll.ToTType]; 
    //do you have a constructor that takes an IEnumerable<Item> ? 
    bttcoll.BreakdownCollection = new BreakdownCollection(items) 
} 

一般情況下,你應該避免改變LINQ查詢的內部對象的狀態。 Linq來自功能性編程思維模式,其中狀態永遠不會改變(相反,新對象是用所需狀態創建的)。

0

如果David B給出的答案很好,但不要在代碼中使用它。第一個(可能)的作品,更容易讓下一個人理解。

有些事情要考慮:

  1. 如果你的代碼將被用於很長一段時間,然後更多的時間將花在維護它,然後在它的原始文字。在您完全忘記自己在做什麼之後,您將不得不修改行爲。讓自己更輕鬆。
  2. 如果你的代碼不會長時間使用,那麼你花了更多的時間來調整風格和流程,然後將被恢復。
  3. 在聲明式樣式中使用表達式樣式Linq沒有速度優勢。編譯器會爲您轉換代碼,並且在大多數情況下會與您自己編寫的代碼一樣高效。