Używam ResourceDictionary, ale chciałbym móc wyszukać wartość lub klucz z innym elementem. Każdy jest zawsze unikalny, więc nie stanowi to problemu. Czy istnieje typ, który ma funkcję dwustronnego wyszukiwania?Co może być używane jako dwustronny słownik zasobów?
Odpowiedz
Nie jest wbudowany, ale można go łatwo napisać. Prawdopodobnie jednak zaimplementuję IDictionary w tym przypadku ... Wtedy zrzucisz ResourceDictionary do swojego niestandardowego typu.
public class DoubleLookup<TKey, TValue>
{
private IDictionary<TKey, TValue> keys;
private IDictionary<TValue, TKey> values;
//stuff...
public void Add(TKey key, TValue value)
{
this.keys.Add(key, value);
this.values.Add(value, key);
}
public TKey GetKeyFromValue(TValue value)
{
return this.values[value];
}
public TValue GetValueFromKey(TKey key)
{
return this.keys[key];
}
}
Zachowaj ostrożność podczas odwracania relacji klucz/wartość w słowniku.
Umowa ze słownikiem gwarantuje, że dla każdej wartości w zbiorze znajduje się dokładnie jeden klucz, który odwzorowuje tę wartość. Klucze są unikalne. Ale odwrotność nie jest prawdą; dla każdej odrębnej wartości może istnieć wiele różnych odwzorowań kluczy na tę wartość.
W mojej własnej bibliotece kodów osobistych (napisanej w Javie, która jest wystarczająco blisko), mam klasę MultiMap dla tego rodzaju rzeczy. Chociaż klucze są unikalne, każdy klucz może być powiązany z wieloma wartościami. Jest dokładnie taki sam jak mapa>.
Kiedy trzeba wykonać wartość produktów na kluczowych wyszukiwań w kolekcji, zrobić coś takiego:
Map<K, V> lookupTable = ...;
MultiMap<V, K> reverseLookupTable = MapUtil.invert(lookupTable);
V value = ...;
if (reverseLookupTable.containsKey(value)) {
Set<K> keys = reverseLookupTable.get(value);
}
Jeśli używasz czegoś innego niż Multimap (jak HashMap lub słownika) jako swojej odwrocie -strona przeglądowa, ryzykujesz utratą niektórych mapowań V-> K, chyba że możesz zagwarantować, że wszystkie klucze I wszystkie wartości w twojej kolekcji są unikatowe.
EDIT:
Ups. Właśnie zauważyłem, że powiedziałeś, że wszystkie klucze i wartości w twojej kolekcji są unikalne. Ale i tak zostawię tutaj swoją odpowiedź, jako ostrzeżenie dla innych czytających to, którzy mogą nie być w stanie zapewnić tej samej gwarancji.
- 1. Dwustronny/dwukierunkowy słownik w języku C#?
- 2. Oddziel VisualStateManager.VisualStateGroups na słownik zasobów
- 3. Czy renderowanie OpenGL może być używane w monitorach 3D?
- 4. Oracle PLS-00363: wyrażenie "" nie może być używane jako cel przypisania
- 5. Co to jest najlepsze, bezpłatne repozytorium kontroli subversion, które może być używane z pluginem Eclipse?
- 6. Czy jEdit może być używany jako IDE?
- 7. typu nie może być stosowany jako indeksu
- 8. Powinny być używane jako odpowiednik Java dla IDisposable .NET?
- 9. powinno być kiedykolwiek używane encodeURI?
- 10. Co powinno być używane do sprawdzania tożsamości w C++?
- 11. Cabal: Co oznacza "tylko zainstalowane już instancje mogą być używane"?
- 12. WinRT Co może być zamiast AncestorType?
- 13. profilowanie nodejs; co może "Nieznany" być
- 14. Dlaczego klasy mogą być używane jako parametry typu i po co?
- 15. słownik z delegatem jako wartość
- 16. Czy Dart może być używany jako język ogólnego przeznaczenia?
- 17. Opcje korzenia zasobów Vue nie są używane?
- 18. Dwustronny wykres w NetworkX
- 19. Słownik z Func jako kluczem
- 20. Nazwy wejść, które nie powinny być używane?
- 21. Które wdrożenie listy ma być używane?
- 22. Czy klasa abstrakcyjna może być używana jako typ odniesienia?
- 23. Czy jądro Linuksa może być traktowane jako pojedynczy proces?
- 24. Czy BigQuery może być używany jako podstawowy silnik zapytań?
- 25. three.js jak zrobić dwustronny obiekt
- 26. Typ paczki nie może być używany jako typ pakietu dostawcy
- 27. Co oznacza "niespecjalizowany szablon klasy nie może być używany jako argument szablonu"?
- 28. Czy sqlite może być również bazą danych?
- 29. Dlaczego można rozpakować słownik jako krotkę?
- 30. Czy istnieje trwałe miejsce, które jest zawsze zapisywalne, które może być używane jako pamięć podręczna danych przez pakiet?