当我们可以使用 foreach() 迭代集合时,为什么要使用 IEnumerable<T>

0 .net c# asp.net ienumerable .net-core

我想知道我们应该使用的确切位置IEnumberable<T>

我知道如何IEnumerable<T>工作和返回IEnumerator<T>以及所有这些,但最终目标IEnumerable<T>是从集合中查询数据不是吗?这就是我们已经可以使用 foreach() 循环做到的事情吗?那么什么时候使用IEnumerable<T>呢?IEnumerable<T>查询集合的唯一选项的实际场景是什么?

Mar*_*ell 6

但最终目标IEnumerable<T>是从集合中查询数据不是吗?

不; 的目标IEnumerable<T>是提供对序列的访问,该序列可能是也可能不是集合。重点是要抽象出潜在的来源是什么。它可能是一个原始集合,但也可能是:

  • 一些 LINQ(或类似)投影(collection.Where(...).Select(...)等)
  • 对 ADO.NET、redis、套接字、gRPC、文件或其他不易计数、可重复等的数据提供程序的开放查询 - 只是:“一个序列”
  • 进程内数据生成器
  • 一些生产者/消费者设置
  • ETC

如果你知道你总是在迭代一个集合,那么当然:随意使用具体类型,或ICollection<T>/IList<T>等等;但是:并非每个序列都是一个集合。