我有一个.NET集合库的列表,我想删除一个元素。可悲的是,我无法通过直接与另一个对象进行比较来找到它。
我担心使用FindIndex
和RemoveAt
会导致多次遍历列表。
我不知道如何使用枚举器来删除元素,否则可能会有效。
RemoveAll
做我需要的,但在找到一个元素后不会停止。
想法?
答案 0 :(得分:12)
List<T>
有FindIndex
方法接受谓词
int index = words.FindIndex(s => s.StartsWith("x"));
words.RemoveAt(index);
删除以“x”开头的第一个单词。在此示例中,words
被假定为List<string>
。
答案 1 :(得分:2)
如果您只想删除与谓词匹配的第一个元素,可以使用以下(示例):
List<int> list = new List<int>();
list.Remove(list.FirstOrDefault(x => x = 10));
其中(x => x = 10)
显然是匹配对象的谓词。
答案 2 :(得分:1)
编辑:现在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;
}
}
答案 3 :(得分:0)
如果有人需要同样的事情,但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;
}