Trzeba utworzyć nowy KeyValuePair
- należy jednak pamiętać, że jest to rodzaj KVP wartość (struct) W każdym razie, więc to nie jest tak, że wprowadzamy nową nieefektywność w ten sposób. Każda metoda zwracająca KVP i tak tworzyłaby kopię - właśnie tworzysz instancję bezpośrednio.
Zawsze możesz dodać metodę rozszerzenia do IDictionary<TKey, TValue>
jeśli chciałeś:
public static KeyValuePair<TKey, TValue> GetEntry
(this IDictionary<TKey, TValue> dictionary,
TKey key)
{
return new KeyValuePair<TKey, TValue>(key, dictionary[key]);
}
Jak zauważył w komentarzach, to całkiem możliwe, że klucz, który jest przechowywany w słowniku nie jest samo jako jeden pod warunkiem, że jest semantycznie równy - przez jakąś semantykę, która może być dostosowana przez IEqualityComparer
(jak na przykład w słowniku niewrażliwym na wielkość liter). W takim przypadku powyższy kod nie zwróci faktycznego wpisu w słowniku, ale wpis z klucz, który podałeś, aby sprawdzić. Niestety nie ma wydajnym sposobem znalezienia oryginalnego klucza - trzeba by iteracyjne nad słowniku :(
miałem świadomość, że można iteracyjne nad w słowniku i znaleźć odpowiednią pozycję tamtędy , ale nie widzę powodu, dla którego chciałbyś to zrobić, gdy masz doskonały indeksator, który jest O (1) zamiast O (N.)
Moja linia myślenia brzmiała: "Wygląda na to, że nie mogę uzyskać odniesienia do rzeczywistego obiektu KeyValuePair w słowniku. Zastanawiam się, dlaczego nie? ", Że KeyValuePair jest typem wartości, który jednoznacznie daje odpowiedź: Dzięki Jon – user200783
Niestety, powyższe działa tylko wtedy, gdy klucz i klucz przechowywane w słowniku są semantycznie równe. string, string> 'zwany' dic' skonstruowany z 'StringComparer.InvariantCultureIgnoreCase', który zawiera {" Jon "," Skeet "}, a następnie' dic.GetEntry ("JON") 'zwróci {" JON "," Skeet "} Jedyny sposób, w jaki wiem, aby słownik powrócił, jest kluczem do sprawdzenia, czy klucz jest częścią wartości. Wydaje się głupie, ale nie znam żadnej alternatywy: – supercat
@ glassasius: Naprawdę chciałbym, aby firma Sun i Microsoft rozpoznały to w wielu przypadkach warto mieć dokładny klucz zapisany w słowniku lub zestawie.Brak takiej zdolności jest szczególnie szkodliwy dla 'WeakHashMap' Java'a [Widzę silniejsze przypadki użycia dla' WeakIdentityHashMap' lub 'WeakReflexiveSet' [który mapuje klucze do siebie] niż dla' WeakHashSet', który nie jest oparty na tożsamości. nie można łatwo odczytać zapisanych wartości klucza. – supercat