代码之家  ›  专栏  ›  技术社区  ›  kofifus

不可变哈希集RemoveWhere

  •  0
  • kofifus  · 技术社区  · 7 年前

    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 回复  |  直到 7 年前
        1
  •  3
  •   kofifus    7 年前

    我不知道为什么,但你很容易 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();
        }
      }
    }