Linq ToDictionary未定义?

时间:2011-02-24 12:15:16

标签: linq linq-to-sql

我有这段代码

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)

我不知道这段代码有什么问题。

编译时错误msg说:System.Generic.IEnumerable不包含定义和最佳扩展方法重载有一些无效的参数。在我的visual studio工具提示文档中我只能看到ToDictionary方法的两个重载,而我在Web上遇到了两个以上的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>)'   有一些无效的论点

3 个答案:

答案 0 :(得分:15)

编译器消息使错误清除:没有方法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());

答案 1 :(得分:1)

不要在数据库中运行该组操作,它会导致每个组的元素在单独的往返中被提取。

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

答案 2 :(得分:0)

重写了您的代码(并添加了.AsEnumerable()):

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