2011-02-24 96 views
4

我有這樣的代碼未定義Linq ToDictionary?

var contacts = dr.mktDoctorContacts 
    .GroupBy(x => x.ContactType) 
    .Select(zb => new 
    { 
     Key = zb.Key, 
     GroupWiseContacts = zb.Select(x => x.Contact).ToList() 
    }) 
    .ToDictionary<string,List<string>>(y => y.Key, y => y.GroupWiseContacts) 

我不知道什麼是錯用此代碼。

編譯時錯誤消息說:System.Generic.IEnumerable不包含定義和最好的擴展方法重載有一些無效的參數。我只能看到兩個重載ToDictionary法在我的Visual Studio工具提示排序文件,而我所遇到ToDictionary的兩個以上的重載網絡
編輯這裏就在編譯時是準確的錯誤信息

錯誤13「System.Collections.Generic.IEnumerable<AnonymousType#1>」 不包含 「ToDictionary」的定義和最佳推廣 方法重載 「System.Linq.Enumerable.ToDictionary<TSource,TKey>(System.Collections.Generic.IEnumerable<TSource>, System.Func<TSource,TKey>, System.Collections.Generic.IEqualityComparer<TKey>)」 有一些無效參數

+2

你知道這段代碼有什麼問題,你沒有問過問題,我不得不質疑你的文本的目的。 – Lazarus 2011-02-24 12:18:31

+1

你的代碼看起來像一團糟。真。 – Andrey 2011-02-24 12:27:36

+0

@拉扎羅斯這是一個錯字。對不便,請致電 – 2011-02-24 13:09:35

回答

6

編譯器消息使誤差明確:沒有方法ToDictionary它可以接受所指定的參數和類型。

這裏的錯誤在於指定ToDictionary上的類型參數。 MSDN文檔將擴展方法定義爲ToDictionary<TKey, TSource>。示例中的源代碼是IEnumerable<AnonymousType#1>,但是您指定了一個類型List<string>

要更正錯誤,請省略類型參數;編譯器會推斷出正確的類型。你還可以結合SelectToDictionary轉變成一個單一的語句:

var contacts = dr.mktDoctorContacts 
    .GroupBy(x => x.ContactType) 
    .ToDictionary(
     y => y.Key, 
     y => y.Select(x => x.Contact).ToList()); 
+0

非常感謝您指出一個。我錯誤地認爲它是ToDictionary 。 – 2011-02-25 04:32:03

0

重寫了您的代碼(和加入.AsEnumerable()):

var dictionary = dr.mktDoctorContacts 
    .GroupBy(x => x.ContactType) 
    .AsEnumerable() 
    .ToDictionary(
     i => i.Key, 
     i => i.Select(x => x.Contact).ToList() 
    ) 
); 
1

不要在數據庫運行的集團化運作,它會導致每個組的元素,在不同的往返取出。

ILookup<string, string> contacts = dr.mktDoctorContacts 
    .ToLookup<Contact, string, string>(x => x.ContactType, x => x.Contact);