【问题标题】:Why can I not iterate over something with linq that can be iterated over with foreach?为什么我不能用 linq 迭代可以用 foreach 迭代的东西?
【发布时间】:2020-01-27 19:56:39
【问题描述】:

我有一组表格行(类型DataRowCollection)。我这样写是完全有效的:

foreach(var row in myDataRowCollection)
{
  // Something with row
}

但以下内容将无法编译:

myDataRowCollection.ToList();

甚至

myDataRowCollection.Select(...

这些 System.Linq 扩展期望 DataRowCollection 不实现是什么?

【问题讨论】:

  • 不编译意味着什么?它抛出任何异常吗?如果是,则提供错误。
  • 这很简单不是有效的代码,如果我写 .Select (即使在包括 System.Linq 命名空间之后)它下面有一条红线,它是无效的,它不会构建。
  • 否,已添加 System.Linq。
  • 不知道为什么我因此受到了反对 - 如果他们用建设性的批评解释但看不出这里有什么问题,我不介意反对!?
  • myDataRowCollection.Cast<DataRow>().ToList() ... 扩展名用于IEnumerable<T> 而不是IEnumerable

标签: c# linq foreach datarowcollection


【解决方案1】:

foreach() 是基于模式的 (docs),它实际上并不依赖于 IEnumerableGetEnumerator() 就够了。

class A // note: no interface
{
    public IEnumerator GetEnumerator() { ...} 
}

另一方面,Linq 基于IEnumerable<T> 的扩展方法。

您的 DataRowCollection 实现了 IEnumerable 但不是 IEnumerable<DataRow>。对 Linq 来说太旧了。

但是有一些辅助方法可用,myDataRowCollection.AsEnumerable().Select(...) 应该可以工作。

【讨论】:

  • 嗯,好的,谢谢 Henk。我的问题不是关于为什么 foreach 有效,而是更多关于为什么 linq 扩展不起作用,因为 foreach 确实如此。这种类型确实实现了IEnumerable
  • @xdtTransform 它还实现了 IEnumerable。它实现了两者。
  • 感谢 Henk 的更新,这说明了这一点。非常感谢,我会尽可能标记为答案。
  • 删除了我的评论以使评论更清楚,但 Henk 更快地编辑了他的答案。解决方法请参考stackoverflow.com/questions/4974159/…
猜你喜欢
  • 2011-07-12
  • 2017-02-09
  • 2011-02-05
  • 2012-07-21
  • 1970-01-01
  • 2021-08-03
  • 1970-01-01
  • 2011-09-12
  • 1970-01-01
相关资源
最近更新 更多