在c#中,若要只删除`list

如何定位最后一次出现的索引?
要定位最后一次出现的索引,可以使用`FindLastIndex`方法。该方法接受一个谓词(Predicate),返回满足条件的最后一个元素的索引。如果未找到,则返回-1。获取到索引后,即可通过`RemoveAt`进行删除。

using System;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
List<int> numbers = new List<int> { 1, 2, 3, 2, 4, 2, 5 };
int valueToRemove = 2;
// 查找最后一次出现的索引
int lastIndex = numbers.FindLastIndex(x => x == valueToRemove);
if (lastIndex != -1)
{
numbers.RemoveAt(lastIndex);
}
Console.WriteLine(string.Join(", ", numbers));
}
}</int></int>
上述代码将输出:`1, 2, 3, 2, 4, 5`。可以看到,最后一个`2`被成功移除,而前面的两个`2`保留了下来。
如果不使用内置方法,如何手动实现?
如果不依赖`FindLastIndex`,可以通过一个简单的`for`循环从列表的最后一个元素开始向前遍历。一旦找到匹配项,就记录其索引并跳出循环,然后执行删除操作。这种方式逻辑清晰,且易于理解。

using System;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
List<string> items = new List<string> { "apple", "banana", "cherry", "banana", "date" };
string target = "banana";
int indexToDelete = -1;
// 从后向前遍历
for (int i = items.Count - 1; i >= 0; i--)
{
if (items[i] == target)
{
indexToDelete = i;
break; // 找到第一个(即最后一次出现)就停止
}
}
if (indexToDelete != -1)
{
items.RemoveAt(indexToDelete);
}
Console.WriteLine(string.Join(", ", items));
}
}</string></string>
该代码将输出:`apple, banana, cherry, date`。同样,只有最后一个`banana`被删除。
当列表中不存在指定值时会发生什么?
在上述两种方法中,都包含了一个检查步骤:判断找到的索引是否为-1。如果`FindLastIndex`或手动循环没有找到匹配项,索引将为-1。此时,不应调用`RemoveAt`,因为传入-1会导致`ArgumentOutOfRangeException`异常。因此,在实际开发中,务必确保在删除前验证索引的有效性。










