2016-12-29 73 views
3

我有一個聚合相同的項目,並從總結特定值的字典:儲值從檢索concatened關鍵

var test = list.GroupBy(x => new { ID=x.ItemID, Uti=x.UtilityName }) 
       .ToDictionary(x => x.Key, 
          x => x.Sum(t => Convert.ToDecimal(t.EnergyConsumptionQt) 
          )); 

此方法返回一個鍵值的字典,是串ID的串聯和字符串UTI。

我想之一:

創建Dictionary<string, decimal>其中關鍵是組合/級聯ItemID+UtilityName(ID + UTI),或一種方式來獲得從上述試驗變量的值,作爲當前一個我不知道如何指定我想要的值作爲我嘗試返回的所有內容:無法將'X'轉換爲''。

+0

要獲取字典GroupBy()需要兩個參數:var test = list.GroupBy(x => new {ID = x.ItemID,Uti = x.UtilityName},y => y) .ToDictionary(x => x.Key, y => y.Sum(t => Convert.ToDecimal(t.EnergyConsumptionQt) )); – jdweng

回答

2

這樣來做:

var test = list.GroupBy(x => new { ID=x.ItemID, Uti=x.UtilityName }) 
       .ToDictionary(x => x.Key.ID.ToString()+x.Key.Uti, 
          x => x.Sum(t => Convert.ToDecimal(t.EnergyConsumptionQt) 
          )); 
+0

它的工作....最後它比我想象的更簡單...我試圖讓鑰匙在第一部分連接起來,這是愚蠢的考慮到鑰匙設置在'.ToDictionary'之後。謝謝 –

2

與您最初的方法的問題是,annonymous類型是引用類型,這樣字典使用參考作爲重點(而不是值要合併)。

因此,如果您隨後嘗試與例如accesss元素:

var elem = test[new {ID=1, Uti="myUtiName"}] 

,那就可以創建一個新的對象,不存在test所以你會得到一個KeyNotFoundException拋出。

如果您爲字典鍵使用值類型,那麼字典將按照您的預期行事。也許有一個struct - 這樣的事情也許:

struct DictKey 
{ 
    public string UtilityName { get; set; } 
    public int Id { get; set; } 
} 

那麼你test變量可以被初始化:

var test = list 
      .GroupBy(x => new DictKey { Id=x.ItemID, UtilityName=x.UtilityName }) 
      .ToDictionary(x => x.Key, 
         x => x.Sum(t => Convert.ToDecimal(t.EnergyConsumptionQt))); 

,您可以訪問它的元素的東西,如:

var elem = test[new DictKey{Id=1, UtilityName="myUtiName"}] 
+1

匿名類型不能通過引用進行比較。 –

+0

很好的解釋。我積極應付。我一直在回答Marksim,因爲它指出使用LINQ來維護字典的簡單結構。儘管如此,您提供了一種不同的方式來解決可能在將來證明有用的問題,並增加了我的知識。儘管如此,我非常感激。 –