2015-12-29 55 views
3

我有一個IDictionary<string, IList<AppObject>>收集數據,所以它看起來像這樣(這是假的文字說明形狀)C#LINQ - IList的初始化中遍歷多個集合

{ 
    "collections": { 
     "default": [ 
     { 
      "Id": "id/1", 
      "Name": "Object 1", 
      "Value": 1.05 
     }, 
     { 
      "Id": "id/2", 
      "Name": "Object 2", 
      "Value": 2.05 
     }, 
     { 
      "Id": "id/3", 
      "Name": "Object 3", 
      "Value": 3.05 
     }, 
     "default2": [ 
     { 
      "Id": "id/4", 
      "Name": "Object 4", 
      "Value": 1.05 
     }, 
     { 
      "Id": "id/5", 
      "Name": "Object 5", 
      "Value": 2.05 
     }, 
     { 
      "Id": "id/6", 
      "Name": "Object 6", 
      "Value": 3.05 
     }, 
     "default3": [ 
     { 
      "Id": "id/7", 
      "Name": "Object 7", 
      "Value": 1.05 
     }, 
     { 
      "Id": "id/8", 
      "Name": "Object 8", 
      "Value": 2.05 
     }, 
     { 
      "Id": "id/9", 
      "Name": "Object 9", 
      "Value": 3.05 
     } 
    } 
} 

這工作正常,這很簡單足夠。現在我正處於需要從中提取數據的地方;由於某些原因,我需要在初始化程序中而不是方法中執行此操作,所以我不能使用任何類型的變量。 (這是一個RavenDB變壓器內部)

我知道如何讓所有的項目進行具體的集合,像這樣..

results.collections["default"].Sum(...) 
results.collections["default2"].Sum(...) 

但有一個LINQ友好的方式來做到這一點,並選擇我同時從中拉出的那些?

基本上,在這個例子中,我想概括一切的價值場得到的結果,沒有硬編碼的路徑爲「默認」和「默認設置2」,但默認3作爲一個乾淨的LINQ函數。

回答

4

您可以使用的SelectMany做象下面這樣:

results.collections.SelectMany(p => p.Value).Sum(p => p.ValueToSum); 
+0

謝謝!我會試試這個。 – Ciel

2

我知道,這部作品在Linq2Obj:

var collection = new Dictionary<string, IList<AppObject>>(); 
    collection.Add("Default", new List<AppObject>() { new AppObject() {Value=1}}); 
    collection.Add("Default2", new List<AppObject>() { new AppObject() {Value=2}});  
    collection.Sum(l => l.Value.Sum(v => v.Value)); // this line of code should do the job.