2015-05-08 54 views
1

我似乎無法找到解決方案,並且錯誤消息不是很有幫助。LINQ C#使用GroupBy創建詞典詞典

我有一個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)); 

我要回到這個類型化的,因​​爲我需要在其他功能使用它(如果我在它面前扔了變種,它的罰款)。

+1

也許無關,但你最後的陳述沒有意義。如果你使用'var',它仍然是強類型的。你看到的是你的表達式編譯,而不是你想要的/期望的類型。 – Jonesopolis

+0

當你使用'var'時,編譯器給你什麼類型?您可以將鼠標懸停在'var'上並查看類型。 – CoderDennis

+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)作爲字典的值類型,您不能使用這個簽名。

這一個應該做的工作:

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

你能解釋爲什麼這個工程,我的上面沒有?我看到的主要區別在於你沒有將類型添加到ToDictionary的類型,我沒有使用group.Key.iGuid嘗試過,但沒有修復它。爲什麼不輸入ToDictionary修復問題? –

+0

帶有類型的字典簽名不是字典的返回類型。 –

+0

經過編輯的答案可以更好地解釋您的問題 –