为什么IEnumerable .Select()在2种情况中有1种工作? 无法从使用中推断出来

我收到此错误消息:

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

第一种方法使用IEnumerable.Select()没有问题? 第二种方法的问题在哪里?

 private void GetPupilsForSchoolclass() { ObservableCollection pupilsOC = new ObservableCollection ( _adminRepo.GetPupilsBySchoolclassId(_selectedSchoolclass.SchoolclassId).Select(p => new PupilViewModel(p, _adminRepo)) ); SelectedSchoolclass.PupilListViewModel = pupilsOC; } private void GetDocumentsForPupil() { ObservableCollection documentsOC = new ObservableCollection(); IEnumerable documents = _docRepo.GetDocumentsByPupilId(_selectedPupil.Id); documents.Select(doc => documentsOC.Add(doc)); SelectedPupil.Documents.DocumentList = documentsOC; } 

documentsOC.Add返回void
写作没有任何意义(并且是不可能的)。选择.Select(...)

你想要做的事情首先不能起作用; Select是惰性的,在枚举结果之前不会调用您的函数。

你应该使用常规的foreach循环。

怀疑 Add返回void – 是吗? 如果是这样,则无法将其投影到Func<,> – 仅限于Action – 并且Select想要Func<,>

Select与间接的’foreach不同

当您从集合中选择一个Items时,Error似乎缺少Return语句。

例:

 collection = nonLabors.Select(item => { item.Travel_Miles = item.Travel_Miles_Original != null ? decimal.Parse(item.Travel_Miles_Original) : 0; return item; }).ToList(); 

ObservableCollection.Add的返回类型是什么? 通常, Add方法返回void。 你不能使用LINQ Select为所有元素执行一个过程,只有一个返回一些东西的函数(否则Select的返回值来自哪里?)。 相反,您可以使用LINQ ForEach或C#foreach循环。

选择不是 foreach的替代品。 改为使用它:

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