2012-11-19 145 views
1

我有兩個類:查詢嵌套列表

public GeneralClassName 
{ 
    public GeneralClassName() 
    { 
     SpecificList = new List<OtherClass>(); 
    } 
    public string StringValue; 
    public string OtherStringValue; 
    public List<OtherClass> SpecificList; 
} 

public OtherClass 
{ 
    public string Name; 
    public string Number; 
} 

一個JSON反序列化我得到一個不錯List<GeneralClassName>後,結果我要的是一個Dictionary<string, int>,其值是的總和List<GeneralClassName>內的List<OtherClass>內的變數「數字」,而關鍵是變數名稱。

換句話說,我想按名稱對數字進行分組。現在

,跨我的腦海裏傳來的唯一事情是一個嵌套的foreach,這樣的事情:

Dictionary<string, int> resultDictionary = new Dictionary<string, int>(); 
foreach(List<OtherClass> listOtherClass in bigListGeneralClass.Select(x => x.SpecificList)) 
{ 
    foreach(OtherClass otherClass in listOtherClass) 
    { 
     int value = 0; 
     if(resultDictionary.ContainsKey(otherClass.Name)) 
     { 
      resultDictionary[otherClass.Name] += otherClass.Number; 
     } 
     else 
     { 
      resultDictionary.Add(otherClass.Name, otherClass.Number); 
     } 
    } 
} 

雖然這種解決方案似乎運作良好,我不喜歡它。 有沒有更簡潔的方法來找到這個結果?也許通過一個不錯的LINQ查詢?

+1

什麼otherClass.count?你的意思是otherClass.Number? –

+0

當我第一次寫這個問題時,我使用了一個不同的變量名。然後在閱讀文本時,我發現使用「計數」令人困惑。你發現的那個必須滑倒:|對於錯誤感謝,並感謝編輯。 – Abaco

回答

6

由於您不使用GeneralClassName中的任何信息,因此您可以使用SelectMany來平整您的列表。這個OtherClass實例的平面列表是由Name屬性分組的。最後,組列表轉化爲與組(又名Name屬性)的關鍵一本字典是新屬性的關鍵,併爲所有Number值的該組中的總和值:

var result = bigListGeneralClass.SelectMany(x => x.SpecificList) 
           .GroupBy(x => x.Name) 
           .ToDictionary(x => x.Key, 
               x => x.Sum(y => y.Number)); 

此代碼假設OtherClass.Number實際上是int而不是string。這個假設也被用於循環的示例代碼中。
如果這種假設不正確,請將y.Number更改爲int.Parse(CultureInfo.InvariantCulture, y.Number)
注意:如果任何數字無法解析,這將引發異常,因此您可能需要事先確定所有數字都包含有效數字。

0

試試這個:

Dictionary<string, int> result = 
      bigListGeneralClass.SpecificList.GroupBy(sl => sl.Name) 
           .ToDictionary(group => group.Key, group => group.Sum(x => Int32.Parse(x.Number))); 
+0

這不起作用,因爲'List '沒有'SpecificList'成員。 –

+0

@DanielHilgarth bigListGeneralClass不是GeneralClassName的列表,它只是GeneralClassName類型的對象。 –

+0

@DanielHilgarth對不起,我很粗心。 'bigListGeneralClass.SelectMany(l => l.SpecificList).GroupBy(sl => sl.Name) .ToDictionary(group => group.Key,group => group.Sum(x => Int32.Parse(x .Number)));' 這是更正後的版本。 –