在Dictionary键中搜索某些部分并更新其值

时间:2016-04-20 12:28:25

标签: .net vb.net

  Dim List As New Dictionary(Of String, Double)

List.Add("krunal", 21.65)
List.Add("krunal SQL", 22.65)
List.Add("krunal Ora", 23.65)
List.Add("Spaghetti alla puttanesca ", 24.65)
List.Add("Spaghetti alla gricia ", 25.65)
List.Add("Spaghetti ale vongole", 26.65)
List.Add("Spaghetti Bolognese", 27.65)

If List.Where(Function(x) x.Key.Contains("SQL")).Any() Then
    List.Item("SQL") =2
End If

并更新find Part的值? 如何搜索和更新它?

3 个答案:

答案 0 :(得分:3)

更新您需要通过实际键访问它的词典:

For Each key In List.Keys.Where(Function(x) x.Contains("SQL"))
    List(key) = 2
Next

答案 1 :(得分:0)

你所拥有的是正确的路线;

您可以迭代与该键匹配的KeyValuePair,但是您需要找到与引用匹配的项目的键回到您的列表中:

    For Each matchingKeyValuePair In List.Where(Function(kvp) kvp.Key.Contains("SQL"))
        List(matchingKeyValuePair.Key) = 99.99
    Next

如果你正在搜索的话,你也可以迭代'Keys`:

For Each matchingKey In List.Keys.Where(Function(key) key.Contains("SQL"))
     List(matchingKey) = 99.99
Next

请注意,而不是

.Contains("SQL")区分大小写。

您可能真的想要:

.IndexOf("SQL", 0, StringComparison.CurrentCultureIgnoreCase) <> -1不是

答案 2 :(得分:0)

请注意,stringDictionary的密钥区分大小写。这意味着,如果您添加"SQL",那么当您通过索引器在字典中直接查找或使用{{1}时,它只匹配"SQL"而不匹配"sql""Sql" }} 方法。我之所以提到这一点是因为很容易意外地将多个项目添加到字典中,其中每个项目键的外壳是唯一的区别,而不会出现错误。您必须防止这种情况或将您的密钥转换为大写或小写,然后使用对象作为包含您正在存储的项目的编号和正确大小的值。

方法Contains(string key)也区分大小写。如果您要执行不区分大小写的搜索,可以将代码更改为使用string.IndexOf

string.Contains

From the documentation

  

OrdinalIgnoreCase

     

使用序数(二进制)排序规则比较字符串,并忽略要比较的字符串的大小写。

修改

根据最后的评论,由于字典的大小,OP似乎想要比循环更快的东西。我能看到的唯一可以做的就是使用TPL和多线程。将检查放在方法体内或传递给ForEach的集合外部取决于您需要更新的预期命中数/真实条件。您必须使用与实际环境中预期相匹配的样本数据对其进行几次测试。

For Each key In List.Keys.Where(Function(x) x.IndexOf("SQL", StringComparison.OrdinalIgnoreCase) >= 0)
    List(key) = 2 ' use key as the indexer
Next

或者这个

Parallel.ForEach(List.Keys.Where(Function(x) x.IndexOf("SQL", StringComparison.OrdinalIgnoreCase) >= 0).ToList(), Sub(currentKey)
        List(currentKey) = 2 ' use key as the indexer
    End Sub)

您可能没有看到差异,但我会测试您的数据的两种方式,并测量哪一种更快。要开始测量时间,请使用Parallel.ForEach(List.Keys, Sub(currentKey) If currentKey.IndexOf("SQL", StringComparison.OrdinalIgnoreCase) >= 0) Then List(currentKey) = 2 ' use key as the indexer End If End Sub) 实例。