3

我有一个包含 5 个项目的列表。

我想提取最后一项,例如:

string lastItem = myList.Last();

但在此之后,myList 必须包含 4 个项目,除了刚刚提取的最后一个项目之外的所有项目。

是否可以?或者我需要使用.Take(4)?

4

5 回答 5

5

如果要取最后一个,可以执行以下操作。

string lastItem = myList.Last();
myList.Remove(myList.Last());
//myList.Count() will now be 4.
于 2012-08-23T08:29:59.257 回答
4

您可以使用List.RemoveList.RemoveRange方法List.RemoveAt从列表中删除元素。

要在使用您使用的列表索引器获得对列表的引用后删除列表的最后一个元素:

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

使用RemoveAt而不是Remove更有效,因为不需要首先找到要删除的项目的索引,并且还要注意Remove只删除与要删除的项目匹配的第一个匹配项,因此在具有重复项的列表中不会最后一个元素。

最后,如果您有一个算法会多次删除列表的最后一项,您不妨考虑另一种数据结构,例如Queue.

于 2012-08-23T08:28:23.263 回答
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);

这意味着您可以按索引“提取”任何项目。

于 2012-08-23T08:32:30.967 回答
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 
于 2012-08-23T08:33:50.443 回答
1

为什么不使用 Stack 而不是 List 似乎更合适

[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);
}
于 2012-08-23T08:50:02.050 回答