【问题标题】:What is a custom collection?什么是自定义集合?
【发布时间】:2012-12-16 16:58:09
【问题描述】:

一组对象。但是我在以下情况下感到困惑。

一个示例类

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

以上哪个是自定义集合,数组或将数组作为字段保存的对象或两者都是自定义集合。

【问题讨论】:

  • 根据我的定义,数组不是“自定义集合”。但你的呢?
  • 当我推出自己的类时,我通常保留术语“自定义集合”,该类完全隐藏对某些底层集合的访问(基本上实现了IEnumerable、@ 987654323@、IList 等接口或仅公开用于访问数据的公共成员),否则只是一种数据结构,不是 BCL 提供的内置结构之一。
  • 你的命名习惯让我抓狂 :D 这就像 python puke

标签: c# .net arrays generic-collections


【解决方案1】:

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

现在,A_List 中的 Array 字段绝对是一个集合(但不是“自定义”集合),而您的 A_List (可以说)是一个集合,但它有用吗?

集合是一组通常相关的对象,您将它们放在一起以便概括对所有对象的某些操作。您可能希望使用该集合的方式有很多种,但最常见的方式在许多编程语言中已经非常标准化。 例如,为了使集合“有用”,您通常至少需要能够在只进循环中从第一个到最后一个读取它的元素。 您的 A_List 不直接提供此信息。您可以轻松添加自定义方法来执行此操作,但您可以更进一步并实现现有接口。

如果您在 A_List 上实现了 IEnumerable&lt;T&gt;,您不仅可以遍历它,而且还可以在许多需要 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&lt;String&gt;,具有三个值(0some、1another、2one),但这并不重要;重要的是(通过实现IEnumerable&lt;T&gt;)just_an_object 可以与 Linq 方法一起使用,该方法与 Array 或 List 或大多数其他“标准”集合的工作方式相同。 另外,请注意foreachZip 都不需要知道您的list 字段是Array 而不是List&lt;A&gt;red-black tree you implemented yourself,因此您可能希望将其设为private

除了遍历它之外,您可能还想对集合进行其他操作。添加或删除元素,提供索引器(以便您可以使用 just_an_object[n] 访问第 n 个元素)。与 IEnumerable 一样,有一些接口可以让您以“标准化”方式实现它们(查找 ICollection 和 IList)。

还有“自定义”方面。让您决定需要自定义集合而不是直接使用已经为您完成所有这些事情的 Array 或 List 的那些开箱即用...

【讨论】:

  • 我一直在尝试了解 Ienumerable 在实际代码中的使用,并在这种情况下提出了这个问题。你在这方面帮助了我很多。 Thaaaaaank 你.....
  • @WinCoder 不客气,这就是我们来这里的目的...... :) 很高兴我得到了帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
相关资源
最近更新 更多