2011-10-31 19 views
1

什麼是我可以用來檢索最後一個入口位置的最好或更容易的容器?輕鬆獲取最後一個輸入位置?

還是沒有比使用Count更好或更容易?依靠伯爵可以嗎?

例子:

List<Class> myList = new List<Class>(); 
int lastEntry = myList.Count - 1; 
Message.Box(myList[lastEntry].Name); 

還有就是這個列表中沒有並行寫入主要閱讀。

回答

2

使用Count是罰款List<T> - 或任何其他實現ICollection<T>ICollection - 但你必須在你的代碼的off-by-one error。它應該是...

int lastEntry = myList.Count - 1; // index is zero-based 
+0

是的,我的壞是寫在急於和可能會留下一些錯過,所以使用計數將是最快的方式,但簡單和大多數列表類型可用? – Guapo

+0

@Guapo:實現「ICollection 」或「ICollection」的所有內容都具有「Count」屬性。 – LukeH

2

計數將是最高效的,但因爲列表索引是從零開始的,你會想用count - 1檢索列表中的最後一項。

如果你真的想你可以使用LINQ和做類似:

myList.Last() 

,或者,如果你擔心空列表

myList.LastOrDefault() 

但是,這將會很可能會比較慢(視如何實現Last())

+0

可能值得添加.LastOrDefault()來考慮0長度的列表。 – deepee1

+0

謝謝....當我開始回答問題時想到了這個問題。生活與ADD :) – ckramer

0

如果您只需訪問列表中的最後一項,則最好使用Stack<T>代替。對於你寫的代碼,使用Count沒有問題 - 請記住,你應該使用.Count - 1

1

你也可以使用Last,它可以幫助你避免像你所做的那樣的錯誤。

附註:Last針對IList實現進行了優化,以使用與您所做的完全相同的方法:使用索引進行訪問。確定它可能比手動執行(優化需要額外的投射)要慢,但除非它確實是一個瓶頸,否則我不會太擔心。

如果你有興趣來研究這個主題更深刻,這裏的喬恩斯基特的優秀系列的一部分:Reimplementing LINQ to Objects: Part 11 - First/Single/Last and the ...OrDefault versions

1

你可以採取Last()擴展方法的優點,像這樣:

Message.Box(myList.Last().Name); 
+1

是的,但會迭代思考整個列表,inst? – Guapo

+1

這取決於'Last'的實現,我不確定。在支持它的集合上使用'Count'可能會很聰明,如果它只實現了'IEnumerable'(這是我實現它的方式),它就會回到枚舉類型。 –

+0

@NathanAnderson:這正是它的實現方式 - 它爲其他情況使用了「IList」的索引訪問和基於常規迭代的方法。 –

0

使用堆棧:

Stack<Class> d = new Stack<Class>(); 
Class last = d.Pop(); 
Message.Box(last.Name); 

,或者如果你不想刪除:

Class last = d.Peek(); 
    Message.Box(last.Name); 
0

我想說明一點,似乎已經掩蓋了。列表不是隊列;你並不總是添加到最後。你可以改爲插入到他們。如果你想在最後插入項目的索引,你必須得到多一點創意:

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類型變量或參數的值。

相關問題