【问题标题】:Can I directly "Extract" an Item from a List<>?我可以直接从 List<> 中“提取”一个项目吗?
【发布时间】:2012-08-23 08:26:02
【问题描述】:

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

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

string lastItem = myList.Last();

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

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

【问题讨论】:

  • 嗨,markzzz,恐怕你可以在队列中这样做,如果你想在列表中这样做,你应该自己Remove该项目。

标签: c# .net linq list


【解决方案1】:

如果你想拿最后一个,你可以这样做。

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

【讨论】:

  • 如果最后一项已多次添加到列表中,则不会删除最后一项。
  • 确实如此。如果列表可以包含多个 samte 字符串,则这将无法按预期工作。那么 RemoveAt(int) 更准确。
  • IList&lt;T&gt; 使用Last 的情况下是特殊情况下使用Count 所以没关系,但在非IList&lt;T&gt; 项目的情况下,它将产生两个枚举器并进行两次完整的迭代。也就是说,这种低效率的窗口非常小,因为它可能只发生在自定义集合上,并且显然不直接应用于 OP,因为他们使用IList&lt;T&gt;
【解决方案2】:

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

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

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

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

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

【讨论】:

    【解决方案3】:

    您可以创建一个扩展方法,该方法采用任何索引来执行提取/删除:

    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);
    

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

    【讨论】:

      【解决方案4】:

      创建一个扩展方法来做到这一点

      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 
      

      【讨论】:

        【解决方案5】:

        为什么不使用 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);
        }
        

        【讨论】:

        • 不错的方法,但这取决于他对列表的处理方式。仅针对问题所有者描述的特定问题,您的方法似乎不错
        猜你喜欢
        • 1970-01-01
        • 2011-05-30
        • 2018-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-05
        • 1970-01-01
        • 2013-02-08
        相关资源
        最近更新 更多