【问题标题】:How to manually make a alternative object to List<> object如何手动创建 List<> 对象的替代对象
【发布时间】:2016-02-19 11:09:28
【问题描述】:

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

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()
        {

        }
    }

【问题讨论】:

  • 大概你想实现,IList&lt;T&gt;接口?
  • 您已经接受了上一个问题的答案。这个问题和你上一个问题有什么不同?
  • 我用过 List。在这里,我需要用方法制作自己的对象...@FINDarkside
  • MyList 是您自己的带有方法的对象。
  • 接受德米特里的回答。他成功了。

标签: c# list object collections


【解决方案1】:

一种方法是实现IList&lt;T&gt;接口,即

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

    ...
  }

所以MyDefinedListList&lt;T&gt; 一样工作(它实现了IList&lt;T&gt;),同时还有一些额外的方法。另一种方法是在List&lt;T&gt; 上实现扩展方法(所以现在每个List&lt;T&gt;都有DeleteItemFront 方法):

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      public class MyDefinedList
      {
          private object _MyDefinedList;
      
          public MyDefinedList()
          {
              _MyDefinedList = new MyDefinedList();
          }        
      }
      

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

      1. 以已经实现的东西为例。 IE。您应该将您的类包装在一些已经具有类似功能但接口不同的集合类的实例周围。 Google for Adapter 模式。您也可以在这里使用扩展方法。
      2. 扩展已经实现的东西。 IE。从某个集合类继承并添加您需要的方法。
      3. 编写您自己的实现。您可以使用数组、创建一些链表等。

      如果您选择第一个选项,那么您可以将您的课程包装在列表周围:

        private List<int> _innerList;
      

      考虑也继承自List&lt;int&gt;(第二个选项):

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

      【讨论】:

      • 我不应该继承任何东西,也不应该使用任何已经存在的东西。应该从头开始。 @sergey
      • @Jack Dawson 为什么?如果您真的必须从头开始做所有事情,那么您可以使用数组并在添加项目时手动使它们变大。
      • 这就是任务。不要问我为什么... :) @FINDarkside
      • 没有。我想得到一个小费或类似的东西,也许是一种理论方法。有什么要开始的。 @SergeyBerezovskiy
      • @JackDawson 你需要回答为什么如果你想要正确\有用的答案......看起来你只是想知道 List 类是如何实现的,你想复制逻辑并创建你的课……所以你可以查看源代码……微软已经公开了……你为什么要把它作为问题发布
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-30
      • 2012-06-10
      相关资源
      最近更新 更多