【问题标题】:LINQ C# Creating Dictionary of Dictionaries using GroupByLINQ C# 使用 GroupBy 创建字典字典
【发布时间】:2015-05-08 20:52:06
【问题描述】:

我似乎找不到解决办法,而且错误信息也不是很有帮助。

我有一个数据表:

iGuid、iDateTime、iDecimal

我想创建一个字典词典,这样......

iGuid -> iDateTime -> iDecimal.

例如。

Guid1, Monday, 4
Guid1, Tuesday, 4
Guid1, Friday, 1
Guid2, Monday, 1
Guid2, Tuesday, 1

现在我想把它做成一个字典,键为iGuid,值另一个字典,键为iDateTime,值为iDecimal。

我现在的代码是:

Dictionary<Guid, Dictionary<DateTime, decimal>> val = iDataTable.OfType<CustomDataRow>().GroupBy(r => new { r.iGuid } )
    .ToDictionary<Guid, Dictionary<DateTime, decimal>>( row => row.Key.iGuid,
             child => child.ToDictionary<DateTime, decimal>(subKey => subKey.iDateTime, subVal => subVal.iDecimal));

我必须返回这个类型,因为我需要在其他函数中使用它(如果我在它前面抛出一个 var 就可以了)。

【问题讨论】:

  • 可能不相关,但您的最后陈述没有意义。如果你使用var,它仍然是强类型的。您所看到的是您的表达式可以编译,而不是您想要/期望的类型。
  • 当你使用var时,编译器给你的是什么类型?您可以将鼠标悬停在var 上并查看类型。
  • 请发布错误信息
  • 错误信息:CustomDataRow 不包含 ToDictionary 的定义。
  • 对于其他的cmets,它们是匿名类型(但是里面有正确的类型,这就是我困惑的原因)

标签: c# linq dictionary


【解决方案1】:

你的实现的问题是方法的错误使用:

    public static Dictionary<TKey, TSource> ToDictionary<TSource, TKey>(
    this IEnumerable<TSource> source,
    Func<TSource, TKey> keySelector
)

如您所见,此调用中指定的类型不是字典的预期返回类型。

https://msdn.microsoft.com/en-us/library/vstudio/bb549277(v=vs.100).aspx

由于您没有使用源 (CustomDataRow) 作为字典的值类型,因此您不能使用此签名。

这个应该做的工作:

Dictionary<Guid, Dictionary<DateTime, decimal>> val = 
    iDataTable
    .OfType<CustomDataRow>()
    .GroupBy(r => r.iGuid)
    .ToDictionary(group => group.Key, 
                  group => group.ToDictionary(dataRow => dataRow.iDateTime, 
                                              dataRow => dataRow.iDecimal));

【讨论】:

  • 你能解释一下为什么这行得通而我上面的行不通吗?我看到的主要区别是您没有将类型添加到 ToDictionary 中,我在没有 group.Key.iGuid 的情况下尝试过这个,但它没有修复它。为什么输入 ToDictionary 不能解决问题?
  • 带类型的字典签名不是字典的返回类型。
  • 已编辑答案以更好地解释您的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-08
  • 2014-06-21
  • 2018-06-21
相关资源
最近更新 更多