【问题标题】:Why does the IEnumerable<T>.Select() works in 1 of 2 cases ? Can not be inferred from usage为什么 IEnumerable<T>.Select() 在 2 个案例中的 1 个中有效?无法从使用情况推断
【发布时间】:2011-06-05 12:07:03
【问题描述】:

我收到此错误消息:

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&lt;T&gt;.Select() 没有问题? 第二种方法的问题在哪里?

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;
}

【问题讨论】:

    标签: c# select ienumerable inferred-type


    【解决方案1】:

    当您从集合中选择一个项目时,错误似乎缺少 Return 语句。

    例子:

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

    【讨论】:

      【解决方案2】:

      Select 不是 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;
      

      【讨论】:

      • 如果你只是想让 doc 把它放在某个地方,这里不需要大的逻辑/计算,因为我会使用 foreach。
      【解决方案3】:

      怀疑 Add 返回void - 对吗?如果是这样,则无法将其投射到Func&lt;,&gt; - 只能投射到Action&lt;T&gt; - 并且Select 想要Func&lt;,&gt;

      Select与间接`foreach

      相同

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          documentsOC.Add 返回void
          .Select&lt;Something, void&gt;(...) 没有任何意义(也是不可能的)。

          你试图做的事情一开始是行不通的; Select 是懒惰的,在您枚举结果之前不会调用您的函数。

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

          【讨论】:

          • 地狱...在一分钟之内,市中心的答案风暴:P 啊是的太固定在视图模型上,但 IEnumerable 对于 OCollection 的 Ctor => ObservableCollection 文件OC 来说已经足够了= new ObservableCollection(_docRepo.GetDocumentsByPupilId(_selectedPupil.Id));
          猜你喜欢
          • 2019-09-03
          • 1970-01-01
          • 2013-12-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-26
          • 1970-01-01
          • 2011-09-27
          相关资源
          最近更新 更多