【问题标题】:Should List<T>.Remove be preceded with List<T>.Exists?List<T>.Remove 应该在 List<T>.Exists 之前吗?
【发布时间】:2023-04-01 14:46:01
【问题描述】:

拥有List&lt;string&gt; paths = new List&lt;string&gt;(); 我想删除我不确定是否存在的项目。我应该检查它是否存在还是直接运行 Remove 方法?

if (paths.Exists(stringVar))paths.Remove(stringVar) 之前是否需要或被认为是一种好的做法?

在不存在的情况下运行 Remove 只会返回 false,以防列表中没有此类项目。

【问题讨论】:

  • 它不会抛出异常,尽管在删除项目之前检查是否存在总是一个好习惯。它不会伤害:)
  • @Devjosh:这是不必要的,并且在具有大列表的性能关键情况下受到伤害,因为通过额外的检查,列表被遍历两次而不是一次。
  • @daniel 谢谢我不知道删除方法的默认行为

标签: c# .net list generics


【解决方案1】:

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

如果项目被成功移除,则为真; 否则为假。这种方法也 如果在中未找到项目,则返回 false 列表。

【讨论】:

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

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

【讨论】:

  • 不仅不会增加好处,而且还需要再次扫描列表(即 O(N))
  • 对。我已经在我对 Devjosh 对这个问题的评论的评论中指出了这一点。
猜你喜欢
  • 2011-03-13
  • 2011-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-20
相关资源
最近更新 更多