今天我发布了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()
{
}
}
答案 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次后,它不会神奇地出现。您有三种选择:
如果您选择第一个选项,那么您可以将您的课程包装在列表中:
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