È necessario creare un nuovo KeyValuePair
- ma tenere a mente che KVP è un tipo di valore (una struct) comunque, quindi non è come si sta introducendo un nuovo inefficienza in questo modo. Qualsiasi metodo che restituisce un KVP dovrebbe comunque creare una copia: stai solo creando l'istanza direttamente.
Si può sempre aggiungere un metodo di estensione per IDictionary<TKey, TValue>
se si voleva:
public static KeyValuePair<TKey, TValue> GetEntry
(this IDictionary<TKey, TValue> dictionary,
TKey key)
{
return new KeyValuePair<TKey, TValue>(key, dictionary[key]);
}
Come notato nei commenti, è del tutto possibile che la chiave che è memorizzata nel dizionario non è la stessa come quello fornito, solo semanticamente uguale - da una semantica che potrebbe essere personalizzata da un IEqualityComparer
(come con un dizionario insensibile alle maiuscole, per esempio.) In tal caso, il codice sopra non restituirebbe la voce effettiva nel dizionario, ma una voce con la chiave che hai fornito per cercare. Purtroppo non c'è modo efficace di trovare la chiave originale - che avrebbe dovuto iterare dizionario :(
ero consapevole che si potrebbe iterare le voci del dizionario e trovare la voce appropriata in questo modo , ma non vedo alcuna ragione per cui tu voglia mai farlo quando hai un indicizzatore perfettamente buono che è O (1) invece di O (N).
fonte
2009-10-24 21:02:09
La mia linea di pensiero era: "Sembra che non riesca a ottenere un riferimento all'oggetto KeyValuePair reale all'interno del dizionario. Mi chiedo perché no? ". KeyValuePair è un tipo di valore che risponde chiaramente. Grazie Jon – user200783
Sfortunatamente, quanto sopra funziona solo se il parametro chiave e la chiave memorizzati nel dizionario sono semanticamente uguali. stringa, stringa> 'chiamata' dic' costruita con 'StringComparer.InvariantCultureIgnoreCase' che contiene {" Jon "," Skeet "}, quindi' dic.GetEntry ("JON") 'restituisce {" JON "," Skeet "} L'unico modo che conosco per fare in modo che un dizionario restituisca la chiave di una ricerca è che la chiave sia parte del valore. Sembra stupida, ma non conosco alternative – supercat
@eglasius: Spero davvero che Sun e Microsoft lo abbiano riconosciuto in molti casi è utile avere la chiave esatta che è memorizzata in un dizionario o in un set.La mancanza di tale capacità è particolarmente dannosa per Java 'WeakHashMap' [Vedo casi di utilizzo più intensi per un' WeakIdentityHashMap', o 'WeakReflexiveSet' [che mappa le chiavi a se stessi] piuttosto che per un' WeakHashSet 'non basato sull'identità che non può leggere prontamente i valori chiave memorizzati. – supercat