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

75

我在 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#的列表中删除最后一行。 请帮忙。

4
List<> 是有效的 C# 语法,它表示一个泛型列表。而 user."" 不是有效的 C# 语法。 - Tim Schmelter
7
添加或删除下一个元素的意义在哪里?首先检查条件,如果不符合条件则添加行,否则不添加。 - Marius Bancila
如果您没有在其他地方存储输入索引,那么在List类中无法删除最后添加的项。我想您是想删除最后一项,但是您提供的整个示例都是毫无意义的。 - Tarec
6个回答

119

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

rows.RemoveAt(rows.Count - 1)

91

这个问题的直接答案是:

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

然而... 就这个问题的特定情况而言,最好的做法是一开始就不要添加这行:

Row row = new Row();
//...      

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

说实话,我会更进一步地测试"Something"user.""的条件,只有在条件满足时才实例化一个Row。但是由于user.""无法编译,我将把这留给读者作为练习。


1
有时您可能想将刚添加到列表中的项目添加然后删除。例如,如果由于不同的业务逻辑而需要检查许多if-elseif条件。在这种情况下,您可以在if-elseif条件之前先添加行。如果在验证所有条件后没有一个条件得到满足,则从列表中删除此行。您可以将rows.Add()放入每个条件中,但这意味着如果您有10个IF语句,则必须将rows.Add()添加到每个10个IF语句中。 - Dongminator
这可能更有意义...但它并没有回答问题。 - DrMcCleod
3
考虑到这个问题在搜索引擎上的流行度,我对它进行了编辑,以便那些只想快速解决问题的人能更容易理解。 - spender
3
我尝试使用 rows.RemoveAt(^1),但是它无法编译通过:第 1 个参数: 无法将类型 'System.Index' 转换为 'int'。我认为 Index 类型不能与 RemoveAt() 方法一起使用。 - Carl Walsh

14
rows.RemoveAt(rows.Count - 1);

10
该死,在 C# 中没有像 pop_back() 这样的方法?有点烦人。 - antred
1
@antred LinkedList 支持列表上的 RemoveFirstRemoveLast 操作。 - shashwat

9
你可以使用 List<T>.RemoveAt 方法:
rows.RemoveAt(rows.Count -1);

3
如果您需要更频繁地这样做,甚至可以创建自己的方法以弹出最后一个元素; 就像这样:
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,而是字符串,因为我们希望该函数返回一个字符串...


-3

我宁愿使用LINQ中的Last()来完成它。

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

或者

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

12
如果您已经知道索引位置(例如,使用Count-1获得最后一个项),请勿使用它,而应该使用RemoveAt。如果使用Remove(T item)方法,会按升序顺序搜索第一个出现的传递项,这可能是rows.Last(),并使用其EqualityComparer(默认值或由您指定)。当列表包含rows.Last()的重复项时,仅会删除第一个匹配项,而不是最后一个匹配项,除非 EqualityComparer 检查的不仅仅是ReferenceEquals,这是EqualityComparer<RefType>.Default 的默认行为。因此,您的解决方案会导致性能下降和错误行为。 - Teneko
这会带来巨大的性能损失! - Jonan Gueorguiev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接