2016-12-29 14 views
3

から取得:これは、文字列IDの連結であるキー値を持つ辞書を返し辞書に保管値または私は同じ項目を集約する辞書を持っているから特定の値を合計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) 
          )); 

と文字列Uti。

Iいずれかたい:

キーが現在のように、組み合わせ/連結ItemID+UtilityName(ID + UTI)であり、または上記試験変数から値を取得する方法たDictionary<string, decimal>を作成私が試したすべてのものから、私が望む価値をどのように指定するかはわかりません: 'X'を ''に変換することはできません。

+0

へGroupBy()は次の2つのパラメータを必要とします: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

それをこのように実行します。辞書はキー(というよりも、あなたがしたい値として参照を使用していますので、あなたの最初のアプローチに問題がAnnonymousの型が参照型であるということです

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

を組み合わせる)。このように

あなたはその後、例えば持つ要素をaccesssしようとした場合:

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

その後、あなたが実際にあなたがKeyNotFoundExceptionがスローになるだろうのでtestに存在しない新しいオブジェクトを作成します。

代わりに辞書キーに値の種類を使用すると、辞書は期待どおりに動作します。おそらく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

すばらしい説明。私はそれのためにupvoted。私は、Marksimの回答には、LINQを使って辞書の簡単な構造を維持することを指していたので、回答しています。それにもかかわらず、将来的に役立ち、自分の知識に追加された可能性のある問題に対処する別の方法を提供しました。そして、私はとても感謝しています。 –

関連する問題