ImmutableHashSet RemoveWhere

时间:2018-08-16 01:52:00

标签: c# c#-7.0

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的原因吗?

1 个答案:

答案 0 :(得分:3)

我不知道为什么不这样做,但是您自己可以轻松地将copy the implementation作为扩展方法。您只需要将ImmutableHashSet转换为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();
    }
  }
}