c# - 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
?
解决方案
我不知道为什么它没有,但是您很容易自己将实现复制为扩展方法。您只需要将 转换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();
}
}
}