我可以直接从列表中“提取”一个项目<&gt ;?

时间:2012-08-23 08:26:03

标签: c# .net linq list

我有5个项目列表。

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

string lastItem = myList.Last();

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

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

5 个答案:

答案 0 :(得分:5)

如果您想拍摄最后一张,可以执行以下操作。

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

答案 1 :(得分:4)

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

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

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

使用RemoveAt代替Remove更有效率,因为无需首先找到要删除的项的索引,还要注意Remove只删除第一次出现的内容匹配要删除的项目,因此在具有重复项的列表中,它不会是最后一个元素。

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

答案 2 :(得分: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);

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

答案 3 :(得分: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 

答案 4 :(得分: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);
}