如何手动创建List<>的替代对象对象

时间:2016-02-19 11:09:29

标签: c# list object collections

今天我发布了question,虽然我的问题已经解决了。在与该问题相关的对话之后,我意识到我需要创建自己的object,它看起来像List<int>并定义我自己的方法(插入,添加等...)。我面临的问题可能是理论上要面对的问题,但另一方面,我认为一些代码会有所帮助。我无法想象我的新定义对象应该看起来如何熟悉List<>及其方法。任何建议都将被感激地接受。这是一些代码...我希望我不会被误解。

public class MyDefinedList
    {
        private object _MyDefinedList;

        public MyDefinedList()
        {
            _MyDefinedList = new MyDefinedList();
        }

        public void AddItemFront(int pItem)
        {
            _MyDefinedList.Insert(0, pItem);
        }

        public void AddItemBehind(int pItem)
        {
            _MyDefinedList.Add(pItem);
        }

        public void DeleteItemFront()
        {
            _MyDefinedList.RemoveAt(0);
        }

        public void DeleteItemBehind()
        {
            _MyDefinedList.RemoveAt();
        }

        private void Insert(int pStart, int p)
        { 

        }

        private void Add(int pItem)
        {

        }

        private void RemoveAt()
        {

        }
    }

3 个答案:

答案 0 :(得分:2)

一种方法是实现IList<T>接口,即

  public class MyDefinedList: IList<T> {
    // back ground list that actually stores the data
    private List<T> m_List = new List<T>();

    ...

    public void Add(T item) {
      m_List.Add(item); // Nothing to write home about
    }

    public void DeleteItemFront() {
      m_List.RemoveAt(0);
    } 

    ...
  }

所以MyDefinedList作为List<T>(它实现IList<T>),同时有一些额外的方法。另一种方法是在List<T>上实施扩展方法(所以现在每个List<T> 都有 DeleteItemFront方法):

  public static class ListExtensions {
    public void DeleteItemFront<T>(this IList<T> list) {
      if (null == list) 
        throw new ArgumentNullException(nameof(list));  

      list.RemoveAt(0);
    } 
    ...
  } 

答案 1 :(得分:0)

您目前正在将您的课程包装好......本身:

public class MyDefinedList
{
    private object _MyDefinedList;

    public MyDefinedList()
    {
        _MyDefinedList = new MyDefinedList();
    }        
}

如果不可能,则创建此类的实例。 MyDefinedList的每个实例都将创建MyDefinedList的新实例,它将创建MyDefinedList的新实例等。结果 - StackOverflowException。但即使有可能,您认为收集的实施会在哪里出现?创建MyDefinedList 1000次后,它不会神奇地出现。您有三种选择:

  1. 获取已经实施的内容的实例。即你应该将你的类包装在一些已经具有类似功能但具有不同界面的集合类的实例中。 Google for Adapter 模式。你也可以在这里使用扩展方法。
  2. 扩展已经实施的内容。即从某个集合类继承并添加您需要的方法。
  3. 编写自己的实现。您可以使用数组,创建一些链接列表等。
  4. 如果您选择第一个选项,那么您可以将您的课程包装在列表中:

      private List<int> _innerList;
    

    还要考虑继承List<int>(第二个选项):

    public class MyDefinedList : List<int>
    {
        public void AddItemFront (int pItem)
        {
            Insert(0, pItem);
        }
    
        public void AddItemBehind (int pItem)
        {
            Add(pItem);
        }
    
        public void DeleteItemFront()
        {
            if (Count == 0)
                throw new InvalidOperationException();
    
            RemoveAt(0);
        }
    
        public void DeleteItemBehind()
        {
            if (Count == 0)
                throw new InvalidOperationException();
    
            RemoveAt(Count - 1);
        }
    }
    

答案 2 :(得分:0)

所以基本上和其他人一样,我不明白为什么你不能只使用内置的集合类型(也许是一些面试任务)。无论如何,你可以在C#中阅读有关索引器的内容: Indexers