.net - 在 .NET 中,为什么 IEnumerable 抽象存在,如果它只获取一个 IEnumerator 对象?
问题描述
为什么我需要 IEnumerable 作为抽象而不是“这就是它的设计方式”并且一切都在他们的签名中期待 IEnumerable?难道他们不能从 IEnumerator 开始并且从未使 IEnumerable 成为可能吗?
我已经阅读了各种 SO 问题,但我仍然不确定答案。这似乎是历史性的。我不是在问任何事情本身是如何工作的或如何迭代事物。我只是问为什么存在 IEnumerable 而不仅仅是 IEnumerator。为什么存在 IEnumerable的抽象?
解决方案
难道他们不能从 IEnumerator 开始并且从未使 IEnumerable 成为可能吗?
不,每次调用GetEnumerator()
都是独立的,即
var iter1 = obj.GetEnumerator();
var iter2 = obj.GetEnumerator();
// now iter1 and iter2 can be advanced separately and
// have nothing to do with each-other, usually
在几乎所有情况下,这些单独的调用GetEnumerator()
将来自不同的调用位置或可能来自不同的线程,但是:它们将单独报告。IEnumerable[<T>]
API 只是宣传“有方法GetEnumerator()
”。如果这里只有一个接口,那么当一个对象“是”(即实现该接口)时,除了冲突之外别无选择——您将永远无法在相同数据上获得单独的枚举数。
推荐阅读
- reactjs - React.Lazy 不适用于延迟加载 div 中的图像
- python - 如何从网页中抓取该字段
- java - Pushlink for Android10-更新使应用程序崩溃
- python - 每年计算每位客户最近的两次付款,然后取平均值
- go-git - 如何在 go-git 中创建空树
- sql - 如何使用 SQL 查询在 Django ManytoMany 中访问数据
- r - R将嵌套列表与同一行中的常量相乘
- html - 子宽度 100% 与父溢出-x: 向右滚动后自动无法正常工作
- python - 在 Python 中创建邻接字典
- django - Django admin:自定义操作模板,用于重定向到另一个管理操作的按钮