ContainsValue with Dictionary(Of String, Items)

ContainsValue with Dictionary(Of String, Items)

如何知道具有多个值的字典是否包含特定值?

'Create dictionary
Dim testDictionary As New Dictionary(Of String, Items)

'Code to fill dictionary
'.......................
'.......................
'.......................

'Test if a specific value is contained in dictionary
Dim testValue as String = "TEST"
testDictionary.ContainsValue(testValue) 'This doesn't work

Public Class Items
    Public Property Property1 As String
    Public Property Property2 As String
    Public Sub New()
    End Sub
End Class

如果您可以定义如何确定字典是否包含该字符串,请将该逻辑传递给 Enumerable.Any

Dim testValue As String = "TEST"

Dim contains = testDictionary.Any(Function(kvp) kvp.Value.Property1 = testValue OrElse kvp.Value.Property2 = testValue)
If contains Then
    Dim containsEntries = testDictionary.Where(Function(kvp) kvp.Value.Property1 = testValue OrElse kvp.Value.Property2 = testValue)
End If

由于您将它重用于 Any 和 Where,您可以声明谓词一次

Dim predicate =
    Function(kvp As KeyValuePair(Of String, Items))
        Return kvp.Value.Property1 = testValue OrElse kvp.Value.Property2 = testValue
    End Function
Dim contains = testDictionary.Any(predicate)
If contains Then
    Dim containsEntries = testDictionary.Where(predicate)
End If

这是硬编码到这些属性 Property1 和 Property2。

(如果你想要实体,你真的不需要 Any;我只是想 Any 用布尔值回答了你的问题 "How to know if..."

如果要检查所有 public 实例字符串属性,可以使用反射

Dim predicate =
    Function(kvp As KeyValuePair(Of String, Items))
        Return GetType(Items).
            GetProperties(Reflection.BindingFlags.Public Or Reflection.BindingFlags.Instance).
            Where(Function(pi) pi.PropertyType Is GetType(String)).
            Aggregate(False, Function(pi1, pi2) pi1 Or (pi2.GetValue(kvp.Value) = testValue))
    End Function
Dim containsWith = testDictionary.Any(predicate)
If containsWith Then
    Dim containsEntries = testDictionary.Where(predicate)
End If