一组物体。但是我在以下情况下感到困惑。
示例类
class A
{
public string Foo{get; set;}
}
class A_list
{
public A[] list;
public A_list(A[] _list)
{
list = new A[_list.Length];
for (int i = 0; i < _list.Length; i++)
{
list[i] = _list[i];
}
}
}
static void Main(String[] args)
{
A[] names = new A[3]
{
new A{Foo="some"},
new A{Foo="another"},
new A{Foo="one"}
};
A_list just_an_object = new A_list(names);
}
以上哪个是自定义集合数组或将数组作为字段保存的对象,或者都是自定义集合。
答案 0 :(得分:3)
将一个集合描述为“一组对象”在技术上是正确的,但也有点过于简化。一个更好的问题是“什么是有用的集合?”,“有用”会让你问自己“我该如何使用它”?
现在,A_List中的数组字段绝对是一个集合(但不是“自定义”集合),而您的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,1另一个,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)。
然后有“自定义”方面。那些让你决定需要自定义集合的那些,而不是直接使用已经开箱即用的所有这些东西的数组或列表......