首页 > 解决方案 > ImmutableHashSet RemoveWhere

问题描述

HashSet<T>public int RemoveWhere(Predicate<T> match)

然而ImmutableHashSet<T>没有。

我最终会这样做:

var x = ImmutableHashSet<int>.Empty.Add(5).Add(3);

var next = x.Where(i => i>4).ToImmutableHashSet();

哪个有效但丑陋,主要是我不确定它的效率?

有没有更好的办法 ?有没有理由ImmutableHashSet没有RemoveWhere

标签: c#c#-7.0

解决方案


我不知道为什么它没有,但是您很容易自己将实现复制为扩展方法。您只需要将 转换ImmutableHashSet为 a ImmutableHashSet.Builder,逻辑就可以完全一样。

namespace System.Collections.Immutable {
  public static class ExtensionMethods {
    public static ImmutableHashSet<T> RemoveWhere<T>(this ImmutableHashSet<T> hashSet, Predicate<T> match) => 
      hashSet.RemoveWhere(match, out _);

    public static ImmutableHashSet<T> RemoveWhere<T>(this ImmutableHashSet<T> hashSet, Predicate<T> match, out int numRemoved) {
      if (match == null) throw new ArgumentNullException(nameof(match));
      var hashSetBuilder = hashSet.ToBuilder();
      numRemoved = 0;
      foreach (var value in hashSet) if (match(value) && hashSetBuilder.Remove(value)) numRemoved++;
      return hashSetBuilder.ToImmutable();
    }
  }
}

推荐阅读