Linq ToDictionary не определен? - PullRequest
7 голосов
/ 24 февраля 2011

У меня есть этот код

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 в виде визуальной всплывающей подсказки в своей студии, в то время как я встречал более двух перегрузок 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 ]

16 голосов
/ 24 февраля 2011

Сообщение компилятора проясняет ошибку: не существует метода ToDictionary, который мог бы принимать указанные аргументы и типы.

Ошибка здесь заключается в указании аргументов типа в ToDictionary.Документация MSDN определяет метод расширения как ToDictionary<TKey, TSource>.Источник в вашем примере - IEnumerable<AnonymousType#1>, но вы указали тип List<string>.

Чтобы исправить ошибку, опустите аргументы типа;компилятор выведет правильные типы.Вы можете дополнительно объединить преобразования Select и ToDictionary в один оператор:

var contacts = dr.mktDoctorContacts
    .GroupBy(x => x.ContactType)
    .ToDictionary(
        y => y.Key, 
        y => y.Select(x => x.Contact).ToList());
1 голос
/ 24 февраля 2011

Не запускайте эту групповую операцию в базе данных, это приведет к тому, что элементы каждой группы будут извлекаться в отдельных циклах.

ILookup<string, string> contacts = dr.mktDoctorContacts
  .ToLookup<Contact, string, string>(x => x.ContactType, x => x.Contact);
0 голосов
/ 24 февраля 2011

Переписал ваш код (и добавил .AsEnumerable()):

var dictionary = dr.mktDoctorContacts
    .GroupBy(x => x.ContactType)
    .AsEnumerable()
    .ToDictionary(
        i => i.Key, 
        i => i.Select(x => x.Contact).ToList()
    )
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...