linq 尝试从某些对象的集合中收集字符串ID(或简单字符串字段)时出错

inn6fuwd  于 2022-12-06  发布在  其他
关注(0)|答案(1)|浏览(131)

我有一个名为Order的类,其中一个字段是id,它是Order对象的唯一标识符。
所以我做了一些简单的事情来获取这些订单ID

Dim myOrderIds = (From x In Orders
                      Select x.id)

我得到myOrderIds的类是IEnumerable(Of String),这是我所期望的。现在我想检查myOrderIds是否包含与其他OrderIds相同的内容。所以我应该把两者都放在一个HashSet中,并使用SetEqual,对吗?

Dim myOrderIdSet = myOrderIds.ToHashSet

这显然很简单,不要再简单了,我有一个数组,列表,可枚举的ID,我想把它放在一个hashSet中,非常简单
我得到了这个错误

Severity    Code    Description Project File    Line    Suppression State
Error   BC30521 Overload resolution failed because no accessible 'ToHashSet' is most specific for these arguments:
    Extension method 'Public Function ToHashSet() As HashSet(Of String)' defined in 'Enumerable': Not most specific.
    Extension method 'Public Function ToHashSet() As HashSet(Of String)' defined in 'MoreEnumerable': Not most specific.    nicehash2   C:\Users\teguh\Dropbox\vb.net\gridtrading.vb    22  Active

在我看来,ToHashSet方法好像在某个地方声明了两次,不知何故,它们发生了冲突。但这怎么可能呢?微软的人没有正确地编写代码?我该怎么办?

hgqdbh6s

hgqdbh6s1#

这不是微软的错,错误信息说其中一个选项来自MoreEnumerable,我认为是来自MoreLinq NuGet包,您必须已经安装。如果您已经汇入两个相关的命名空间,则编译器将无法判断您想要呼叫哪一个。如果您无法移除NuGet套件或该内容中的其中一个命名空间汇入,则您可以'不要将方法作为扩展调用。如果将其作为常规方法调用,则可以限定名称以消除歧义,例如:

Dim myOrderIdSet = System.Linq.Enumerable.ToHashSet(myOrderIds)

另一种方法是使用HashSet(Of T)构造函数,该构造函数接受IEnumerable(Of T)作为参数。

相关问题