VB.Net中统计ConcurrentDictionary路径含指定字符串的条目数
问题描述
我定义了如下ConcurrentDictionary:
Private cdEmailsUploaded As New ConcurrentDictionary(Of String, Boolean)
其中String类型的键存储邮件文件(MSG)的完整路径,我希望编写函数统计路径含指定字符串(如"ProjectX")的条目数量。
我原想将字典转数组后搜索,但不确定是否最优,且编写代码时遇到语法问题,无法正确搜索字典的键。当前代码如下:
Function QtyUploadedToLocation(sFind As String) As Integer Dim emailsArr = cdEmailsUploaded.ToArray Dim result As String() = Array.FindAll(emailsArr, Function(s) s.Key.StartsWith(sFind)) Return result.Length End Function
错误提示:
Value of type 'KeyValuePair(Of String, Boolean)()' cannot be converted
to 'String()' because 'KeyValuePair(Of String, Boolean)' is not
derived from 'String'.
求正确实现代码及更优解决思路。
解决方案
1. 修正现有代码的错误
报错原因是Array.FindAll返回的是KeyValuePair(Of String, Boolean)()类型,你却试图赋值给String()类型变量,类型不匹配。直接统计匹配的键值对数量即可,无需转换为字符串数组:
Function QtyUploadedToLocation(sFind As String) As Integer Dim emailsArr = cdEmailsUploaded.ToArray ' 统计符合条件的键值对数量,无需转换类型 Return Array.FindAll(emailsArr, Function(kvp) kvp.Key.Contains(sFind)).Length End Function
注:如果需求是路径以指定字符串开头,保留StartsWith即可;如果是路径包含指定字符串,用Contains更贴合描述。
2. 更优实现思路
不需要把整个字典转成数组,直接利用ConcurrentDictionary的Keys集合结合LINQ统计,避免不必要的内存开销:
Imports System.Linq Function QtyUploadedToLocation(sFind As String) As Integer ' 直接遍历Keys集合统计符合条件的数量 Return cdEmailsUploaded.Keys.Count(Function(key) key.Contains(sFind)) End Function
优势说明
- 省去
ToArray()的数组拷贝操作,减少内存占用 - LINQ的
Count方法按需遍历,性能更高效 - 代码更简洁,可读性更强
如果需要忽略大小写匹配,可以指定StringComparison参数:
Return cdEmailsUploaded.Keys.Count(Function(key) key.Contains(sFind, StringComparison.OrdinalIgnoreCase))
内容的提问来源于stack exchange,提问作者Max Headroom
相关产品推荐
相关产品推荐

