LINQ中的字典无法使用.Count()方法

3
当我在VB.NET中尝试以下操作时:
Dim data = New Dictionary(Of String, Integer)
data.Count(Function(x) x.Value > 0) 'Compile-time error!

我在.Net Fiddle上遇到了这个编译错误:

参数过多:'Public Overloads ReadOnly Property Count As Integer'

Visual Studio 给出了以下错误提示:

'Public ReadOnly Property Count As Integer' 没有参数,其返回类型不能被索引。

不过下面的代码可以正常工作:
Enumerable.Where(data, Function(x) x.Value > 0).Count() 'Works!
data.Where(Function(x) x.Value > 0).Count() 'Works!

似乎找不到正确的重载方法。
奇怪的是,这个 C# 版本在 Visual Studio 中运行良好(但在 .NET Fiddle 中失败了 - 奇怪...发生了什么?):
var data = new Dictionary<string, int>();
data.Count(x => x.Value > 0);

如何正确使用带有谓词的LINQ版本的.Count()来针对字典进行操作?


相关链接:https://dev59.com/m3bZa4cB1Zd3GeqPI7jH - Jeff B
2个回答

7

当名称冲突时,您需要使用AsEnumerable()(请参阅“备注”部分)来选择扩展方法。

data.AsEnumerable().Count(Function(x) x.Value > 0)

3

然而,VB.NET中它的工作方式与C#不同是有原因的:

当在范围内的实例方法具有与调用语句的参数兼容的签名时,实例方法优先于任何扩展方法选择。 即使扩展方法更匹配,实例方法也具有优先权。

甚至

对于属性,情况就简单得多:如果扩展方法与它所扩展的类的属性同名,则扩展方法不可见且无法访问。

Dictionary(Of TKey, TValue) Class已经有一个名为Count的属性,因此Count扩展被隐藏了。

扩展方法(Visual Basic)> 扩展方法、实例方法和属性

由于@Mark已经回答了如何的部分,所以我会跳过那部分。


1
谢谢解释。但愿我有一个“部分类答案”,可以授予给你们两个 ;) - Jeff B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接