List<T>.Remove是否应该先于List<T>.Exists使用?

25

有一个 List<string> paths = new List<string>(); ,我想删除不确定是否存在的某个项目。我应该检查它是否存在,还是直接运行Remove方法?

在运行paths.Remove(stringVar)之前,是否需要使用if(paths.Exists(stringVar))或被认为是一种良好的做法?

如果列表中没有这样的项,运行Remove而不进行Exists检查将简单地返回false。


虽然它不会抛出异常,但最好在删除项目之前检查其是否存在。这样做不会有任何问题 :) - Devjosh
5
@Devjosh说:在性能关键的大型列表情况下,这是不必要的并且会损害性能,因为有了额外的检查,列表需要遍历两次而不是一次。 - Daniel Hilgarth
1
@daniel 谢谢,我不知道 remove 方法的默认行为。 - Devjosh
2个回答

34

它不会抛出异常,也不需要额外的检查。请查看MSDN:

如果成功删除了项,则返回 true;否则返回 false。如果列表中没有找到该项,该方法也会返回 false。


理论上来说是这样的。但是,我遇到过一种情况,其中有多个线程访问Remove并且偶尔会遇到从实现中的某个地方发出的IndexOutOfRange异常。最终,我将其变成了ImmutableList以解决这个问题。 - DiamondBack
@DiamondBack,从理论和实践上来说,当你在单线程中使用它时是正确的。普通列表不声称是线程安全的,为此,您可以使用相应的数据结构进行设计。即使您首先要检查元素的存在,当删除元素时,您也可能遇到相同的异常。为了快速执行操作,标准数据结构不使用锁定/解锁过程,因为它会增加开销,但并发列表/队列/...确实支持多线程。 - Saeed Amiri

13

不要进行检查。因为Remove已经进行了检查。你额外的检查是多余的,没有任何好处。


它不仅没有增加任何好处,而且需要对列表进行另一次扫描(这是O(N))。 - Isak Savo
1
好的。我已经在问题的Devjosh评论中指出了这一点。 - Daniel Hilgarth

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