2012-08-23 91 views
2

我有一個列表中的5項。我可以直接從列表中「提取」一個項目嗎?

我想提取的最後一個項目,如:

string lastItem = myList.Last(); 

,但在此之後,myList中必須包含4項,萬物除了最後一個,這是剛剛提取。

可能嗎?或者我需要使用.Take(4)?

+1

嗨markzzz列表的堆棧,恐怕你只能在隊列中做到這一點,如果你想在列表中找到它,你應該自己「移除」這個物品。 –

回答

4

您可以使用List.RemoveList.RemoveRangeList.RemoveAt方法從列表中刪除元素。

var element = myList[myList.Count - 1]; 
myList.RemoveAt(myList.Count - 1); 

使用RemoveAt,而不是Remove更有效,因爲沒有必要先找到:

要使用您使用列表索引中刪除列表中的最後一個元素,你獲得對它的引用後要刪除的項目的索引,還要注意Remove只是刪除與要刪除項目相匹配的第一個匹配項,因此在具有重複項的列表中,它不會是最後一個元素。最後,如果你有一個算法去除多次列表中的最後一項,你還可以考慮另一個數據結構,比如Queue

5

如果你想採取最後一步,你可以做如下事情。

string lastItem = myList.Last(); 
myList.Remove(myList.Last()); 
//myList.Count() will now be 4. 
+2

如果最後一個項目已多次添加到列表中,則不會刪除最後一個項目。 – hvd

+0

這是真的。如果列表可以包含多個字符串,則這將不起作用。然後RemoveAt(int)更準確。 –

+0

在IList 的情況下,使用'Last'是特殊的,可以使用'Count',所以沒關係,但是在非'IList '的情況下,它會產生兩個枚舉器並執行兩個完整的迭代。也就是說,這種低效率的窗口很小,因爲它可能只發生在自定義集合上,並且顯然不直接應用於OP,因爲它們使用「IList 」。 –

4

您可以創建需要任何索引做取/去除擴展方法:

public static T Extract<T>(this List<T> list, int index) 
{ 
    var item = list[index]; 
    list.RemoveAt(index); 
    return item; 
} 

最後一個項目總是可以使用Count - 1發現,所以通話很簡單:

var item = list.Extract(list.Count - 1); 

這意味着你可以通過索引「提取」任何項目。

2

創建一個擴展方法來做到這一點

public static class Extension 
{ 
    public static string RemoveLast(this IList<string> myList) 
    { 
    int lastItemIndex = myList.Count - 1; 
    string lastItem = myList.Last(); 
    myList.RemoveAt(lastItemIndex); 
    return lastItem; 
    } 
} 

稱其爲

string itemRemoved = lst.RemoveLast(); //this will delete the last element from list & return last element as well 
1

爲什麼不使用,而不是它似乎更適合

[Test] 
public void MyTest() 
{ 
    Stack<int> stack = new Stack<int>(new[] { 1, 2, 3, 4, 5 }); 
    int pop = stack.Pop(); 
    Assert.AreEqual(stack.Count, 4); 
    Assert.AreEqual(pop, 5); 
} 
+0

好方法,但這取決於他在列表中所做的事情。只是針對問題所有者描述的具體問題,您的做法似乎很好 – Adi

相關問題