【问题标题】:How to remove the last element added into the List?如何删除添加到列表中的最后一个元素?
【发布时间】:2014-06-08 08:40:10
【问题描述】:

我在 C# 中有一个列表,我在其中添加列表字段。现在添加时我必须检查条件,如果条件满足,那么我需要从列表中删除添加的最后一行。 这是我的示例代码..

    List<> rows = new List<>();
    foreach (User user in users)
    {
        try
        {
            Row row = new Row();
            row.cell = new string[11];
            row.cell[1] = user."";
            row.cell[0] = user."";
            row.cell[2] = user."";         

            rows.Add(row);

            if (row.cell[0].Equals("Something"))
            {

                //here i have to write code to remove last row from the list
                //row means all the last three fields

            }

        }

所以我的问题是如何从 c# 中的列表中删除最后一行。 请帮帮我。

【问题讨论】:

  • List&lt;&gt;user."" 是有效的 C# 吗?
  • 接下来添加和删除的意义何在?先检查条件,如果不满足则添加行,否则不添加。
  • 如果您没有将输入索引存储在外部某处,则无法在 List 类中删除 LAST ADDED 项。我想您打算只删除最后一项,但是您提供的整个示例毫无意义。

标签: c# list arraylist


【解决方案1】:

我认为最有效的方法是使用RemoveAt

rows.RemoveAt(rows.Count - 1)

【讨论】:

    【解决方案2】:

    这个问题的直接答案是:

    if(rows.Any()) //prevent IndexOutOfRangeException for empty list
    {
        rows.RemoveAt(rows.Count - 1);
    }
    

    注意:Since c#8.0 您可以使用rows.RemoveAt(^1) 代替rows.RemoveAt(rows.Count - 1)

    但是......在这个问题的具体情况下,首先不添加行更有意义:

    Row row = new Row();
    //...      
    
    if (!row.cell[0].Equals("Something"))
    {
        rows.Add(row);
    }
    

    TBH,我会更进一步,通过测试 "Something"user."",甚至不实例化 Row,除非满足条件,但看到 user."" 不会编译,我会留给读者作为练习。

    【讨论】:

    • 在某些情况下,您可能想要添加然后删除刚刚添加到列表中的项目。例如,如果由于不同的业务逻辑需要检查很多 if-elseif 条件。在这种情况下,您可以在 if-elseif 条件之前先添加行。如果在您验证了所有条件后,没有一个条件得到满足,则从列表中删除该行。您可以将 rows.Add() 放入每个条件中,但这意味着如果您有 10 条 IF 语句,那么您必须将 rows.Add() 添加到每 10 条 IF 语句中。
    • 这可能更有意义......但它没有回答问题。
    • @DrMcCleod 鉴于这个问题在搜索引擎中的受欢迎程度,我已经为那些想要快速解决的人进行了编辑。
    • 我正在尝试使用rows.RemoveAt(^1),但它无法编译:Argument 1: cannot convert from 'System.Index' to 'int' 我认为Index 类型不适用于RemoveAt() 方法。
    【解决方案3】:
    rows.RemoveAt(rows.Count - 1);
    

    【讨论】:

    • 该死的,C# 中的 pop_back() 方法一点也不像?这有点糟糕。
    • @antred LinkedList 支持对列表进行RemoveFirstRemoveLast 操作。
    【解决方案4】:

    你可以使用List&lt;T&gt;.RemoveAt方法:

    rows.RemoveAt(rows.Count -1);
    

    【讨论】:

      【解决方案5】:

      如果您需要更频繁地执行此操作,您甚至可以创建自己的方法来弹出最后一个元素;像这样:

      public void pop(List<string> myList) {
          myList.RemoveAt(myList.Count - 1);
      }
      

      甚至可以代替 void 来返回如下值:

      public string pop (List<string> myList) {
          // first assign the  last value to a seperate string 
          string extractedString = myList(myList.Count - 1);
          // then remove it from list
          myList.RemoveAt(myList.Count - 1);
          // then return the value 
          return extractedString;
      }
      

      请注意,第二个方法的返回类型不是 void ,它是 string b/c 我们希望该函数返回一个字符串 ...

      【讨论】:

        【解决方案6】:

        我宁愿使用来自 LINQ 的 Last() 来做。

        rows = rows.Remove(rows.Last());
        

        rows = rows.Remove(rows.LastOrDefault());
        

        【讨论】:

        • 不要使用它,当你有索引时(例如,Count - 1 用于最后一项)并使用RemoveAt。您的解决方案伴随着性能下降和可能的不良行为:Remove(T item) 使用其 EqualityComparer(默认或由您指定)并按升序索引顺序搜索第一次出现的传递项目,可能是 rows.Last()。当您的列表包含 rows.Last() 的重复项时,可能会删除最后一次但第一次出现 如果EqualityComparer 不仅会检查 ReferenceEquals,而这只是 EqualityComparer&lt;RefType&gt;.Default 的默认值。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-27
        相关资源
        最近更新 更多