Почему IEnumerable <T>.Select () работает в 1 из 2 случаев? Не может быть выведено из использования - PullRequest
5 голосов
/ 07 января 2011

Я получаю это сообщение об ошибке:

The type arguments for method 'System.Linq.Enumerable.Select<TSource,TResult>(System.Collections.Generic.IEnumerable<TSource>, System.Func<TSource,int,TResult>)' cannot be inferred from the usage. Try specifying the type arguments explicitly.

Первый метод не имеет проблем с использованием IEnumerable<T>.Select()?Где проблема со 2-м методом?

private void GetPupilsForSchoolclass()
{
   ObservableCollection<PupilViewModel> pupilsOC = new ObservableCollection<PupilViewModel>
   (                            _adminRepo.GetPupilsBySchoolclassId(_selectedSchoolclass.SchoolclassId).Select(p => new       PupilViewModel(p, _adminRepo))
   );
   SelectedSchoolclass.PupilListViewModel = pupilsOC;
}

private void GetDocumentsForPupil()
{
                ObservableCollection<Document> documentsOC = new ObservableCollection<Document>();
                IEnumerable<Document> documents = _docRepo.GetDocumentsByPupilId(_selectedPupil.Id);
                documents.Select(doc => documentsOC.Add(doc));
                SelectedPupil.Documents.DocumentList = documentsOC;
}

Ответы [ 5 ]

13 голосов
/ 07 января 2011

documentsOC.Add возвращает void.
Нет смысла (и невозможно) писать .Select<Something, void>(...).

То, что вы пытаетесь сделать, не может работать в первомместо;Select ленив и не вызывает вашу функцию, пока вы не перечислите результаты.

Вы должны использовать обычный цикл foreach.

3 голосов
/ 24 мая 2013

Похоже, что при возврате элементов из коллекции появляется ошибка «Возврат».

Пример:

collection = nonLabors.Select(item =>
                {
                    item.Travel_Miles = item.Travel_Miles_Original != null ? decimal.Parse(item.Travel_Miles_Original) : 0;
                    return item;
                }).ToList();
2 голосов
/ 07 января 2011

Я подозреваю , что Add возвращает void - это верно?Если это так, то невозможно проецировать это на Func<,> - только на Action<T> - и Select хочет, чтобы Func<,>.

Select было , а не такой же как косвенный `foreach

1 голос
/ 07 января 2011

Какой тип возврата ObservableCollection<Document>.Add? Обычно метод Add возвращает void. Вы не можете использовать LINQ Select для выполнения процедуры для всех элементов, только функцию, которая возвращает что-то (иначе откуда взятое значение Select? Вместо этого вы можете использовать LINQ ForEach или цикл Cachach foreach.

0 голосов
/ 07 января 2011

Выбор - , а не замена для foreach.Используйте это вместо:

ObservableCollection<Document> documentsOC = new ObservableCollection<Document>();
IEnumerable<Document> documents = _docRepo.GetDocumentsByPupilId(_selectedPupil.Id);
foreach(var doc in documents)
{
    documentsOC.Add(doc);
}
SelectedPupil.Documents.DocumentList = documentsOC;
...