我有这种数据类型:
Dictionary<string, List<Dictionary<string, List<Dictionary<string, List<Dictionary<string, string>>>>>>>
每当我试图触及它的最底部以计算其中的一些东西时,我有一个错误,我无法在KeyValuePairs上使用 foreach :
foreach statement cannot operate on variables of type 'KeyValuePair<string, List<Dictionary<string, List<Dictionary<string, string>>>>>' because 'KeyValuePair<string, List<Dictionary<string, List<Dictionary<string, string>>>>>' does not contain a public definition for 'GetEnumerator' [RestService]
这是循环的一部分:
void GetMetricsCount(List<Dictionary<string, List<Dictionary<string, List<Dictionary<string, string>>>>>> device, Dictionary<string, string> results_holder)
{
// count all metrics
foreach (var type_element in device)
{
foreach (var group_element in type_element)
{
foreach (var wtf in group_element)
现在真的很好,如果有更好的方法来处理C#中那种复杂的数据结构,我真的很感激,如果有人告诉我怎么样,因为这很糟糕!
更新: 我很抱歉,但我在这里复制了一些代码。 以下是对不匹配类型的挫折的答案:
// Get overview of metrics for last 24h
public Dictionary<string, Dictionary<string, string>> GetMetricsOverview()
{
var overview_results = new Dictionary<string, Dictionary<string, string>>();
// get total item count for each metric group and add to holder
void GetMetricsCount(List<Dictionary<string, List<Dictionary<string, List<Dictionary<string, string>>>>>> device, Dictionary<string, string> results_holder)
{
// count all metrics
foreach (var type_element in device)
{
foreach (var group_element in type_element.Values)
{
foreach (var wtf in group_element)
results_holder.Add(group_element.Key + "_count", group_element.Value.Count.ToString());
}
}
//
}
//
答案 0 :(得分:7)
外部循环如下所示:
foreach (var type_element in device)
通过此循环,type_element
变量是Dictionary<string, List<Dictionary<...>>>
引用。听起来你希望跳过一个级别并直接进入下一个List<Dictionary<...>>
。
也许你想要的是这个:
foreach (var type_element in device)
{
foreach (var group_element in type_element.Values)
此处,type_element.Values
仍然是列表的集合,因此group_element
变量仍为List<Dictionary<string, List<Dictionary<string, string>>>>
。
为了完整起见,这意味着您下一级的wtf
变量仍然是Dictionary<string, List<Dictionary<string, string>>>
...如果您考虑的话,这有点疯狂;变量绝对符合它的名字。你确定你不想定义一两个类来获得这些数据的编译时类型安全吗?
要想到最里面的词典,你需要这个:
foreach (var type_element in device)
{
foreach (var type_lists in type_element.Values)
{
foreach(var group_element in type_lists)
{
foreach(var group_lists in group_element.Values)
{
foreach (var wtf in group_lists.Values)
{
//...
Dictionary<string, string>
变量的最终结果为wtf
。但是又一次......整件事情有点荒谬。看起来有点像你正在尝试使用字典重新创建一个完美的类型系统。
您可能还想查看SelectMany()
方法,它可以帮助减少和简化此代码。
也许你正在尝试将Python习语,特别是关联对象语法(item["property"]
)变成.Net。这是个错误。 .Net并不真正做关联对象。您希望为此实际定义类。