将值存储在字典中或从连接键

时间:2016-12-29 12:29:07

标签: 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)
                            ));

这将返回一个字典,其中的键值是字符串ID和字符串Uti的串联。

我想要:

创建一个Dictionary<string, decimal>,其中键是组合/连接ItemID+UtilityName(ID + Uti),或者是从上面的测试变量中获取值的方法,因为当前的我没有知道如何指定我想要的值作为我尝试的所有东西返回:不能将'X'转换为''。

2 个答案:

答案 0 :(得分: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)
                            ));

答案 1 :(得分:2)

您的初始方法的问题是,匿名类型是引用类型,因此字典使用引用作为键(而不是您想要组合的值)。

因此,如果您随后尝试使用例如:

访问元素
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"}]