正在从具有谓词的列表中删除元素

本文关键字:列表 删除 元素 谓词 | 更新日期: 2023-09-27 18:21:35

我有一个来自.NET集合库的列表,我想删除一个元素。遗憾的是,我无法通过与另一个物体直接比较来找到它。

我担心使用FindIndexRemoveAt会导致多次遍历列表。

我不知道如何使用枚举器来删除元素,否则可能会起作用。

RemoveAll做了我需要的事情,但在找到一个元素后不会停止。

想法?

正在从具有谓词的列表中删除元素

List<T>有一个接受谓词的FindIndex方法

int index = words.FindIndex(s => s.StartsWith("x"));
if (index >= 0)
{
    words.RemoveAt(index);
}

删除以"开头的第一个单词;x〃;。在该示例中,CCD_ 6被假定为CCD_。

如果只想删除与谓词匹配的第一个元素,可以使用以下(示例):

List<int> list = new List<int>();
list.Remove(list.FirstOrDefault(x => x = 10));

其中(x => x = 10)显然是用于匹配对象的谓词。

EDIT:现在OP已经改为使用LinkedList<T>,很容易给出一个只迭代到必须迭代的程度的答案:

public static void RemoveFirst<T>(LinkedList<T> list, Predicate<T> predicate)
{
    var node = list.First;
    while (node != null)
    {
        if (predicate(node.Value))
        {
            list.Remove(node);
            return;
        }
        node = node.Next;
    }
}

如果有人需要同样的东西,但对于IList<T>(受Strillo答案启发,但效率更高)

public bool Remove(this IList<T> list, Predicate<T> predicate)
{
    for(int i = 0; i < list.Count; i++)
    {
        if(predicate(list[i]))
        {
            list.RemoveAt(i);
            return true;
        }                   
    }   
    return false;
}