从HashSet获取原始值 - c#

更新:
从.Net 4.7.2开始,HashSet.TryGetValue - docs可用。
HashSet.TryGetValue - SO post

我对HashSet有问题,因为它没有提供与TryGetValue已知的Dictionary类似的任何方法。我需要这样的方法-传递元素以在集合中找到,并从其集合中设置返回元素(如果找到)。

旁注-“为什么需要集合中的元素,而您已经具有该元素?”。不,我不是,平等和认同是两回事。

HashSet不是密封的,但其所有字段都是私有的,因此从中派生是没有意义的。我不能使用Dictionary,因为我需要SetEquals方法。我当时正在考虑获取HashSet的源并添加所需的方法,但是该许可证并不是真正的开源(我可以看,但是我不能分发/修改)。我可以使用反射,但HashSet中的数组不是readonly,这意味着每个实例生存期一次都无法绑定到那些字段。

而且我不想仅对单个类使用完整的库。

到目前为止,我仍然坚持使用LINQ SingleOrDefault。所以问题是如何解决-将HashSetTryGetValue一起使用?

参考方案

我同意这基本上是缺少的东西。虽然它仅在极少数情况下有用,但我认为它们是非常罕见的情况-最值得注意的是关键规范化。

我现在只能想到一个建议,这确实是犯规的。

您可以在创建IEqualityComparer<T>时指定自己的HashSet<T>-因此,请创建一个记住其执行的最后一个正(即真返回)Equals比较的参数的参数。然后,您可以调用Contains,并查看要求相等比较器进行比较的内容。

注意事项:

这会不必要地保留引用,因此最终可能会阻止对象被垃圾回收
您可能希望在每个线程的基础上执行此操作(例如,如果您有一个在初始化后未修改但会被多个线程读取的集合)
它假定HashSet<T>不使用任何优化方法,例如“如果引用相等,则不必费心咨询相等性比较器”
从根本上讲这是一种可怕的虐待

我一直在尝试寻找交叉路口的其他选择,但是我还没有任何地方...

如评论中所述,最好将其封装起来-我怀疑您只需要一组非常有限的操作,因此我将HashSet<T>包装在您自己的类中,只公开了您真正需要的操作-这样,您就可以在每次操作后清除“缓存”,从而消除了我上面的第一个反对意见。

对我来说,这仍然是一种可怕的虐待,但是...

正如其他人所建议的,替代方法是使用Dictionary<TKey, TValue>并自己实现SetEquals。这样做很简单-再次,您需要将此封装为您自己的类型。无论哪种方式,您都应该首先设计类型本身,然后使用HashSet<>Dictionary<,>作为实现细节来实现它。

将谓词<T>转换为Func <T,bool> - c#

我有一个包含成员Predicate的类,希望在Linq表达式中使用该类:using System.Linq; class MyClass { public bool DoAllHaveSomeProperty() { return m_instrumentList.All(m_filterExpression); } private IEnumerable&…

Junit4和TestNG与Maven在一个项目中 - java

要一起运行它们,几乎没有可用的选项,但是我选择为Junit和TestNG使用不同的配置文件。但是现在的问题是排除和包含测试用例。由于如果我们在Maven的主项目中添加testNG依赖项,它将跳过所有Junit,因此我决定将其放在单独的配置文件中。所以我使用pom.xml中的以下条目从默认(主要)配置文件中排除了TestNG测试:<plugin> …

与哪些运算符>>兼容 - java

我这里没有什么代码int b=3; b=b >> 1; System.out.println(b); 它可以完美工作,但是当我将变量b更改为byte,short,float,double时,它包含错误,但是对于变量int和long来说,它可以完美工作,为什么它不能与其他变量一起工作? 参考方案 位移位运算符(例如>>)与任何整数类型兼…

通过Maven编译器插件不会发生有限的包含和排除 - java

我正在使用3.6.0版的maven编译器插件,在此我们只想在特定文件夹中编译一个文件,而在该位置编译所有其他文件。例如:在文件夹应用程序中有14个文件,从那我只希望编译1个文件,但它编译了所有文件,如果我要排除,则它也不起作用。 <sourceDirectory>${basedir}/../src/java</sourceDirectory…

当我所有的都是T时,如何返回Interface <T>的实例? - java

我有一个界面:public interface ILoginResult<T> { public T get(); } 我有一个LoginPage对象:public class LoginPage<T> { ... public ILoginResult<T> login(...) { ... } } 我也有一些登录页面对…