将一个集合描述为“一组对象”在技术上是正确的,但也有点过于简化。一个更好的问题将是“什么是有用的集合?”,其中“有用”会让你问自己“我该如何使用它”?
现在,A_List中的Array字段绝对是一个集合(但不是“自定义”集合),而您的A_List
(可以说是)集合,但它是一个有用的集合吗?
一个集合是一组一般相关的为了在所有这些对象上推广一些操作而放在一起的对象。你可能想要的方式使用集合很多,但最常见的在许多编程语言中已经非常标准化。例如,为了使集合“有用”,您通常至少需要能够从第一个到最后一个仅向前循环中读取其元素。 您的A_List不直接提供此信息。您可以轻松地添加自定义方法来实现此功能,但您可以先行一步并实现现有界面。
如果您在A_List上实现了IEnumerable<T>
,那么您不仅可以迭代它,还可以在预计IEnumerable
的很多现有代码中与其他集合交替使用您的A_List。例如:
class A_list : IEnumerable<A>
{
// ... your other code
public IEnumerator<A> GetEnumerator()
{
return ((IEnumerable<A>)list).GetEnumerator();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return list.GetEnumerator();
}
}
将允许你这样做你main
:
foreach(var a in just_an_object)
{
Console.WriteLine(a.Foo);
}
或者你可以使用LINQ使用它:
var numbered=just_an_object.Zip(Enumerable.Range(0,3),(a,b) => b.ToString() + a.Foo);
现在编号是IEnumerable<String>
有三个值(0some,1another,2one),但这不重要;重要的是(通过实现IEnumerable<T>
),just_an_object可以与Linq方法一起使用,该方法与Array或List或大多数其他“标准”集合一起工作。 并且也注意到,无论是foreach
也不Zip
需要知道你的list
字段是Array
而不是List<A>
或red-black tree you implemented yourself,所以你可能要使它private
。
除了遍历它之外,还有其他的一些东西,你可能想要处理一个集合。添加或删除元素,提供索引器(以便您可以使用just_an_object[n]
访问第n个元素)。与IEnumerable一样,有一些接口可以让你以“标准化”的方式实现它们(查找ICollection和IList)。
然后有“自定义”方面。那些让你决定你需要你的自定义集合,而不是直接使用Array或List,已经为你开箱即用的所有这些东西...
'Both' - 哪两个? – manojlds
@manojlds问题编辑 –
根据我的定义,数组不是“自定义集合”。但是你的是什么? – usr