将集合描述为“一组对象”在技术上是正确的,但也有点过于简化了。一个更好的问题是“什么是有用的集合?”,“有用的”让你问自己“我需要如何使用它”?
现在, A_List 中的 Array 字段绝对是一个集合(但不是“自定义”集合),而您A_List
的(可以说)是一个集合,但它有用吗?
集合是一组通常相关的对象,您将它们放在一起以便概括对所有对象的某些操作。您可能希望使用该集合的方式有很多,但最常见的方式在许多编程语言中已经非常标准化。例如,为了使集合“有用”,您通常至少需要能够在只进循环中从第一个到最后一个读取它的元素。您的 A_List 不直接提供此信息。您可以轻松添加自定义方法来执行此操作,但您可以提前一步实现现有接口。
如果您IEnumerable<T>
在 A_List 上实现,您不仅可以遍历它,而且还可以在许多需要IEnumerable
. 例如:
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)的 a,但这并不重要;重要的是(通过实现IEnumerable<T>
)just_an_object 可以与 Linq 方法一起使用,该方法与 Array 或 List 或大多数其他“标准”集合的工作方式相同。另外,请注意,既不需要foreach
也不Zip
需要知道您的list
字段是您自己实现的,Array
而不是您自己实现List<A>
的红黑树,因此您可能想要制作它private
。
除了遍历它之外,您可能还想对集合进行其他操作。添加或删除元素,提供索引器(以便您可以使用 访问第 n 个元素just_an_object[n]
)。与 IEnumerable 一样,有一些接口使您能够以“标准化”方式实现它们(查找 ICollection 和 IList)。
然后是“自定义”方面。那些让您决定需要自定义集合而不是直接使用已经为您完成所有这些事情的 Array 或 List 的那些开箱即用......