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
之后设置的,这是愚蠢的。谢谢