什麼是我可以用來檢索最後一個入口位置的最好或更容易的容器?輕鬆獲取最後一個輸入位置?
還是沒有比使用Count更好或更容易?依靠伯爵可以嗎?
例子:
List<Class> myList = new List<Class>();
int lastEntry = myList.Count - 1;
Message.Box(myList[lastEntry].Name);
還有就是這個列表中沒有並行寫入主要閱讀。
什麼是我可以用來檢索最後一個入口位置的最好或更容易的容器?輕鬆獲取最後一個輸入位置?
還是沒有比使用Count更好或更容易?依靠伯爵可以嗎?
例子:
List<Class> myList = new List<Class>();
int lastEntry = myList.Count - 1;
Message.Box(myList[lastEntry].Name);
還有就是這個列表中沒有並行寫入主要閱讀。
使用Count
是罰款List<T>
- 或任何其他實現ICollection<T>
或ICollection
- 但你必須在你的代碼的off-by-one error。它應該是...
int lastEntry = myList.Count - 1; // index is zero-based
如果您只需訪問列表中的最後一項,則最好使用Stack<T>
代替。對於你寫的代碼,使用Count沒有問題 - 請記住,你應該使用.Count - 1
你也可以使用Last,它可以幫助你避免像你所做的那樣的錯誤。
附註:Last
針對IList
實現進行了優化,以使用與您所做的完全相同的方法:使用索引進行訪問。確定它可能比手動執行(優化需要額外的投射)要慢,但除非它確實是一個瓶頸,否則我不會太擔心。
如果你有興趣來研究這個主題更深刻,這裏的喬恩斯基特的優秀系列的一部分:Reimplementing LINQ to Objects: Part 11 - First/Single/Last and the ...OrDefault versions
你可以採取Last()
擴展方法的優點,像這樣:
Message.Box(myList.Last().Name);
是的,但會迭代思考整個列表,inst? – Guapo
這取決於'Last'的實現,我不確定。在支持它的集合上使用'Count'可能會很聰明,如果它只實現了'IEnumerable'(這是我實現它的方式),它就會回到枚舉類型。 –
@NathanAnderson:這正是它的實現方式 - 它爲其他情況使用了「IList」的索引訪問和基於常規迭代的方法。 –
使用堆棧:
Stack<Class> d = new Stack<Class>();
Class last = d.Pop();
Message.Box(last.Name);
,或者如果你不想刪除:
Class last = d.Peek();
Message.Box(last.Name);
我想說明一點,似乎已經掩蓋了。列表不是隊列;你並不總是添加到最後。你可以改爲插入到他們。如果你想在最後插入項目的索引,你必須得到多一點創意:
public class SmartList<T>:List<T>
{
public int LastIndex {get; protected set;}
public new virtual void Add(T obj)
{
base.Add(obj);
lastIndex = Count - 1;
}
public new virtual void AddRange(IEnumerable<T> obj)
{
base.AddRange(obj);
lastIndex = Count - 1;
}
public new virtual void Insert(T obj, int index)
{
base.Insert(obj, index);
lastIndex = index;
}
}
不幸的是列表的方法不是虛擬的,所以你必須隱藏起來,因此你必須使用這個類作爲具體的SmartList;您不能將其用作List類型變量或參數的值。
是的,我的壞是寫在急於和可能會留下一些錯過,所以使用計數將是最快的方式,但簡單和大多數列表類型可用? – Guapo
@Guapo:實現「ICollection」或「ICollection」的所有內容都具有「Count」屬性。 –
LukeH