C# ImmutableHashSet RemoveWhere

C# ImmutableHashSet RemoveWhere,c#,c#-7.0,C#,C# 7.0,HashSet具有公共int-removehere(谓词匹配) 但是,ImmutableHashSet没有 我最终做了: var x = ImmutableHashSet<int>.Empty.Add(5).Add(3); var next = x.Where(i => i>4).ToImmutableHashSet(); var x=ImmutableHashSet.Empty.Add(5.Add(3)); var next=x.Where(i=>i>4).ToIm

HashSet
具有
公共int-removehere(谓词匹配)

但是,
ImmutableHashSet
没有

我最终做了:

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

var next = x.Where(i => i>4).ToImmutableHashSet();
var x=ImmutableHashSet.Empty.Add(5.Add(3));
var next=x.Where(i=>i>4).ToImmutableHashSet();
它能工作,但很难看,主要是我不确定它的有效性

有更好的办法吗?
有没有理由
ImmutableHashSet
没有
RemoveWhere
。您只需要将
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();
    }
  }
}
namespace System.Collections.Immutable{
公共静态类扩展方法{
公共静态ImmutableHashSet RemoveWhere(此ImmutableHashSet hashSet,谓词匹配)=>
hashSet.RemoveWhere(匹配,输出);
公共静态ImmutableHashSet RemoveWhere(此ImmutableHashSet hashSet,谓词匹配,out int numRemoved){
如果(match==null)抛出新的ArgumentNullException(nameof(match));
var hashSetBuilder=hashSet.ToBuilder();
numRemoved=0;
foreach(hashSet中的var值)if(match(value)和&hashSetBuilder.Remove(value))numRemoved++;
返回hashSetBuilder.ToImmutable();
}
}
}

我不知道为什么它不能,但您可以轻松地将其作为一种扩展方法。您只需要将
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();
    }
  }
}
namespace System.Collections.Immutable{
公共静态类扩展方法{
公共静态ImmutableHashSet RemoveWhere(此ImmutableHashSet hashSet,谓词匹配)=>
hashSet.RemoveWhere(匹配,输出);
公共静态ImmutableHashSet RemoveWhere(此ImmutableHashSet hashSet,谓词匹配,out int numRemoved){
如果(match==null)抛出新的ArgumentNullException(nameof(match));
var hashSetBuilder=hashSet.ToBuilder();
numRemoved=0;
foreach(hashSet中的var值)if(match(value)和&hashSetBuilder.Remove(value))numRemoved++;
返回hashSetBuilder.ToImmutable();
}
}
}

谢谢!此扩展方法应属于哪个命名空间?只要您在.cs文件中有一个
using
语句,并且要在其中使用扩展方法,则命名空间对于扩展方法并不重要。好的,我将使用namespace System.Collections.Immutable。。也不应该是公共静态类扩展方法吗?代码也不会编译,您定义numRemoved两次?是的,这篇文章是在浏览器中编写的,可能包含编译器错误提示!此扩展方法应属于哪个命名空间?只要您在.cs文件中有一个
using
语句,并且要在其中使用扩展方法,则命名空间对于扩展方法并不重要。好的,我将使用namespace System.Collections.Immutable。。也不应该是公共静态类扩展方法吗?代码也不会编译,您定义numRemoved两次?是的,这篇文章是在浏览器中编写的,可能包含编译器错误