LINQ C#使用GroupBy创建字典词典

时间:2015-05-08 20:52:07

标签: c# linq dictionary

我似乎无法找到解决方案,但错误消息不是很有帮助。

我有一个DataTable:

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,那很好)。

1 个答案:

答案 0 :(得分:2)

您的实施问题是该方法的错误用法:

    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)作为字典的值Type,因此无法使用此签名。

这个应该做的工作:

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