刚才发现偶然,Add(T)定义在ICollection<T>
中,而不是IEnumerable<T>
。 Enumerable.cs中的扩展方法不包含Add(T),我认为这很奇怪。由于对象是可枚举的,它必须“看起来像”一组项目。谁能告诉我为什么?为什么IEnumerable <T>实现Add(T)?
回答
一个IEnumerable<T>
只是一个元素序列;将其视为仅前向游标。因为很多这些序列都是从数据库中生成值,数据流或记录集,所以Add
项对它们没有任何意义。
+1使用单词*序列*,因为IEnumerable恰好是,而不是某种集合。 – OregonGhost 2010-08-27 08:14:22
downvoters可以解释他们为什么downvoted? – Steven 2012-04-18 18:10:05
IEnumerable
是供阅读,而不是写作。
顾名思义,你可以通过IEnumerable枚举(循环),就是这样。 当你想添加一些东西时,它不会只是一个枚举,因为它有额外的功能。例如,一个数组是一个IEnumerable,但是一个数组的长度是固定的,所以你不能向它添加新的项目。我们可以使用IEnumerable作为所有类型集合的基础(甚至只读集合 - 显然没有Add()方法)。 您将添加到这种“基础接口”的功能越多,它就越具体。
一个枚举就是这样 - 你可以枚举并发现所有项目。这并不意味着你可以添加到它。
能够枚举对于许多类型的对象是通用的。例如,它由数组和集合共享。但是你不能'添加'到一个数组而不会搞乱它的结构 - 而一个Collection是专门构建的添加和删除。
然而,从技术上讲,你可以通过使用Concat<>
来添加一个枚举值,但是所有这些都会创建一个从枚举值枚举到下一值枚举值的枚举值 - 给出单个连续集的错觉。
+1表示可选的Concat。 – Emile 2010-08-27 12:02:47
名称说明了一切。 IEnumerable仅用于枚举项目。 ICollection是项目的实际集合,因此支持Add方法。
每个ICollection
应该是IEnumerable
(我认为,和.NET框架团队似乎同意我;-)),但其他方式并不总是有意义的。在这个世界中存在一个“类似集合的对象”的层次结构,并且假定一个可枚举集合是一个可以添加项目的集合,在该层次结构中不成立。
示例:原色名称列表将为IEnumerable
返回"Red"
,"Blue"
和"Green"
。这也就没有什么逻辑意义的是能够在充满这样的“收藏”做一个primaryColors.Add("Bright Purple")
:
...whatever...
{
...
var primaryColors = EnumeratePrimaryColors();
...
}
private static IEnumerable<string> EnumeratePrimaryColors() {
yield return "Red";
yield return "Blue";
yield return "Green";
}
- 1. 为什么ICollection <T>实现IEnumerable <T>和IEnumerable
- 2. 集合<T>:它为什么既实现IEnumerable又实现IEnumerable <T>?
- 3. 为什么IEnumerable的<T>被定义为IEnumerable <out T>,不IEnumerable的<T>
- 4. 为什么列表<T> .AddRange(IEnumerable的<T>)高于新表快<T>(IEnumerable的<T>)
- 5. 为什么它IEnumerable.Empty <T>()而不是IEnumerable <T> .Empty()?
- 6. 为什么IList的<T>继承了IEnumerable <T>和IEnumerable再次
- 7. 为什么java.lang.ref.Reference <T>实现供应商<T>?
- 8. 为什么HashSet <T>未实现IReadOnlyCollection <T>?
- 9. 如何实现IEnumerable <T>
- 10. 如何实现IEnumerable <T>?
- 11. System.Xml.Linq.XDocument类是否实现IEnumerable <T>?
- 12. 在C++/CLI中实现IEnumerable <T>
- 13. 为什么IEnumerable <T>从IEnumerable继承?
- 14. 将IEnumerable <T>与IEnumerable比较IEnumerable <IEnumerable <T>>
- 15. 为什么不IEnumerable <T>。最大限制T是IComparable?
- 16. T []代表数组,为什么不是IEnumerable <T>?
- 17. 默认值是什么(IEnumerable <T>)?
- 18. 什么演员IEnumerable <T> IEnumerator <T>做
- 19. 如何将IEnumerable <IEnumerable <T>>转换为IEnumerable <T>
- 20. 无法从IEnumerable <T>转换为IEnumerable <T>
- 21. 为什么TreeNodeCollection不能实现IEnumerable <TreeNode>?
- 22. 为什么String类在便携库中实现IEnumerable <char>?
- 23. 为什么ArrayList实现IList,ICollection,IEnumerable?
- 24. 为什么Hashtable实现ICollection和IEnumerable?
- 25. 为什么IList <T>没有插入方法需要IEnumerable <T>?
- 26. 为什么优先使用IEnumerable <T>到列表<T>
- 27. 为什么我不能将IEnumerable <T>列表投射到BindingList <t>?
- 28. IList <T> vs IEnumerable <T>:为什么此作业无效?
- 29. 为什么不科特林阵列<T>实现Iterable <T>
- 30. 为什么XmlSerializer需要从IEnumerable继承的类型来实现Add(System.Object)?
当初的IEnumerable''需要'来实现Add',会有更多的问题其他方式:*为什么'IEnumerable '有'Add' *。它的方式是非常有用的:) –
nawfal
2014-06-08 08:17:59