Содержит значение со словарем (из строки, элементов) - PullRequest
0 голосов
/ 05 марта 2020

Как узнать, содержит ли словарь с несколькими значениями значение c? 1001

'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

1 Ответ

1 голос
/ 06 марта 2020

Если вы можете определить, как определить, содержит ли словарь эту строку, передайте эту логику c в 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..." с логическим значением)

Если вы хотите проверить все публичные c свойства строки экземпляра, вы можете использовать отражение

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
...