2012-12-16 75 views
1

一组对象。不过,我在以下案例中感到困惑。什么是自定义集合?

的样品类

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); 
} 

哪个的上面是一个自定义集合阵列或保存阵列作为场或都是自定义集合的对象。

+3

'Both' - 哪两个? – manojlds

+0

@manojlds问题编辑 –

+0

根据我的定义,数组不是“自定义集合”。但是你的是什么? – usr

回答

3

将一个集合描述为“一组对象”在技术上是正确的,但也有点过于简化。一个更好的问题将是“什么是有用的集合?”,其中“有用”会让你问自己“我该如何使用它”?

现在,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,已经为你开箱即用的所有这些东西...

+0

我一直试图理解在实际代码中使用Ienumerable,并且在这种情况下提出了这个问题。在这方面你刚刚帮了我很多。 Thaaaaaank你..... –

+0

@WinCoder不客气,这就是我们在这里...... :)很高兴我一直在帮助 –