如何删除添加到列表中的最后一个元素?

Posted

技术标签:

【中文标题】如何删除添加到列表中的最后一个元素?【英文标题】: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 项。我想您打算只删除最后一项,但是您提供的整个示例毫无意义。 【参考方案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 的默认值。

以上是关于如何删除添加到列表中的最后一个元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何删除一个list中最后一个元素

java swing 中的列表框JList如何在程序中动态的添加和删除元素

python如何删除列表中的元素

Python 中删除列表元素的三种方法

如何在 C++ 中删除列表中的某些元素

不能只删除链接列表中的最后一个元素! (所有其他具有特定值的元素都会被删除)