C# 将值存储在字典中或从关联键检索

C# 将值存储在字典中或从关联键检索,c#,linq,C#,Linq,我有一个字典,它汇总了相同的项目,并从中求和特定值: var test = list.GroupBy(x => new { ID=x.ItemID, Uti=x.UtilityName }) .ToDictionary(x => x.Key, x => x.Sum(t => Convert.ToDecimal(t.EnergyConsumptionQt)

我有一个字典,它汇总了相同的项目,并从中求和特定值:

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的串联

我想:

创建一个
字典
,其中的键是组合/串联
ItemID+UtilityName
(ID+Uti),或者创建一种从上面的测试变量获取值的方法,作为当前变量,我不知道如何将我想要的值指定为我尝试返回的所有内容:无法将“X”转换为“”

这样做:

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)
                            ));

初始方法的问题是annonymous类型是引用类型,因此字典将引用用作键(而不是要组合的值)

因此,如果您随后尝试访问元素,例如:

var elem = test[new {ID=1, Uti="myUtiName"}]
然后,您实际上创建了一个在
test
中不存在的新对象,这样您将得到一个
KeyNotFoundException
抛出

如果为字典键使用值类型,则字典将按预期运行。可能有一个
struct
——类似这样的可能:

struct DictKey
{
    public string UtilityName { get; set; }
    public int Id { get; set; }
}
然后您的
测试
变量可以用以下参数初始化:

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"}]

要获取字典,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));匿名类型不能通过引用进行比较。很好的解释。我投了赞成票。我保留Marksim的答案,因为它指出使用LINQ来维护字典的简单结构。尽管如此,您提供了一种不同的方法来解决这个问题,这可能会在将来证明是有用的,并增加了我的知识。尽管如此,我还是非常感激。它奏效了。。。。最后它比我想象的要简单。。。我试图在第一部分中把键连接起来,考虑到键是在
.ToDictionary
之后设置的,这是愚蠢的。谢谢