簡體   English   中英

C#-使用數組創建自定義列表時的最佳做法是什么

[英]C# - What are the best practices when creating custom lists using arrays

我有一些功課可以練習一些概念,例如泛型,委托和接口。 整個項目是使用T數組構建自定義列表類。 類也應該實現IEnumerable ,有一個結構是一個IEnumerator 我在這里只關注Add方法。

class MyList<T> : IEnumerable
{
    private static readonly T[] arrayStarter = new T[1];
    private int capacity = 1;
    private int currentItems = 1;

    public T[] TList { get; set; }

    public MyList()
    {
        TList = arrayStarter;
        TList[0] = default(T);
    }

    public  T[] Add(T[] tArray, T item)
    {
        T[] temp = new T[++capacity];
        for (int i = 0; i < tArray.Length; i++)
            temp[i] = tArray[i];
        temp[tArray.Length] = item;
        currentItems++;
        return temp;
    }
}

當我創建列表的實例時,我想使用以下方法添加項目:

MyList<int> m = new MyList<int>();
m.TList = m.Add(m.TList, 5);
m.TList = m.Add(m.TList, 7);
m.TList = m.Add(m.TList, 13);
m.TList = m.Add(m.TList, 15);

我敢肯定,有一種更好的方法來制作自定義列表,希望在那里的人對此事有深入的了解。

此實現表明,您總體上缺少封裝的要點,尤其是缺少使用私有成員的要點。 由於您使TList數組成為列表類的成員,因此您可以將其完全向用戶隱藏。 您的用戶應該能夠寫

m.Add(5);
m.Add(7);

代替

m.TList = m.Add(m.TList, 5);
m.TList = m.Add(m.TList, 7);

完全不用擔心m.TList的存在。

幸運的是,您可以很容易地做到這一點:將TList私有字段,將其重命名為以小寫字母開頭的名稱 ,以遵循C#的命名准則 ,將其從Add的參數列表中刪除,然后將Add更改為不返回任何內容。 這將匹配IList<T>的簽名,您應該考慮實現該簽名。

完成這項工作后,請考慮從currentItems “分離” capacity ,讓第一個更快地增長,而另一個隨着更多項目的增加而趕上它。 這將減少重新分配的次數。

最后,請考慮切換到使用Array.Resize<T>以避免手動復制數據。

如果查看ReferenceSource或ILSpy中List<>Add()方法實現,您將看到以下內容:

private int _size;
private T[] _items;

public void Add(T item)
{
    if (this._size == this._items.Length)
    {
        this.EnsureCapacity(this._size + 1);
    }
    this._items[this._size++] = item;
    this._version++;
}

private void EnsureCapacity(int min)
{
    if (this._items.Length < min)
    {
        int num = (this._items.Length != 0) ? (this._items.Length * 2) : 4;
        if (num > 2146435071)
        {
            num = 2146435071;
        }
        if (num < min)
        {
            num = min;
        }
        this.Capacity = num;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM