Domandaelemento Dizionario accesso
Must loop attraverso tutti gli elementi C# Dictionary
essere fatto solo attraverso foreach
, e se sì perché?
Oppure, potrei chiedere la mia domanda come: possono Dictionary
elementi sono accessibili dalla posizione all'interno dell'oggetto Dictionary
(vale a dire, prima elemento, ultima elemento, terzo rispetto allo scorso elemento, ecc)?
Sfondo a questa domanda
Sto cercando di imparare di più su come Dictionary
oggetti di lavoro, in modo da apprezzerei aiuto avvolgere la mia mente intorno a questo. Sto imparando su questo, quindi ho diversi pensieri che sono tutti legati a questa domanda. Proverò a presentare in modo appropriato per il formato SO.
Research
In C# array, elementi fa riferimento posizione. In un Dictionary
, i valori sono referenziati da chiavi.
Guardando attraverso il documentation on MSDN, vi sono le dichiarazioni
"Ai fini del conteggio, ciascun elemento nel dizionario è trattata come una struttura KeyValuePair che rappresenta un valore e la relativa chiave. L'ordine in cui la gli articoli restituiti non sono definiti. "
Quindi, sembrerebbe che dal momento che gli articoli dell'ordine siano restituiti non è definito, non c'è modo di accedere agli elementi per posizione. Ho letto anche:
"Recupero di un valore utilizzando la sua chiave è molto veloce, vicino a O (1), perché la classe Dictionary è implementato come una tabella hash"
Guardando la documentazione per la HashTable
.NET 4.5 class, si fa riferimento all'utilizzo di una dichiarazione foreach
per scorrere e gli elementi di ritorno. Ma non vi è alcun riferimento all'utilizzo di una dichiarazione for
o, per quella materia, while
o qualsiasi altra istruzione di looping.
Inoltre, ho notato che gli elementi Dictionary
utilizzano l'interfaccia IEnumerable
, che sembra utilizzare l'foreach
come l'unico tipo di istruzione per le funzioni di loop.
Pensieri
Quindi, questo significa che Dictionary
elementi non possono essere accessibili da "posizione", come array o liste possono?
Se è così, perché esiste una proprietà .Count
che restituisce il numero di coppie chiave/valore, eppure nulla che mi consenta di fare riferimento a tali valori per vicinanza al totale? Ad esempio, .Count
è 5, perché non è possibile richiedere coppia chiave/valore .Count
meno 1?
In che modo foreach
è in grado di eseguire il loop su ciascun elemento, ma non ho accesso ai singoli elementi allo stesso modo?
Non esiste un modo per determinare la posizione di un elemento (chiave o valore) in un oggetto , senza utilizzare foreach
? Non posso dire, senza mappare gli elementi in una raccolta, se una chiave è la prima chiave in un Dictionary
o l'ultima chiave?
This SO question e le eccellenti risposte toccano su questo, ma sto specificamente alla ricerca per vedere se ho must elementi di copia a una matrice o un altro tipo enumerabile, per accedere a elementi specifici in base alla posizione.
Ecco un esempio. Si prega di notare che sono non alla ricerca di un modo per risolvere specificamente questo esempio - è solo a scopo illustrativo delle mie domande. Supponiamo di voler aggiungere tutte le chiavi in un oggetto Dictionary<string, string>
a un elenco separato da virgole, senza virgole alla fine. Con una serie che potevo fare:
string[] arrayStr = new string[2] { "Test1", "Test2" };
string outStr = "";
for (int i = 0; i < arrayStr.Length; i++)
{
outStr += arrayStr[i];
if (i < arrayStr.Length - 1)
{
outStr += ", ";
}
}
con Dictionary<string, string>
, come potrei copiare ogni chiave per outStr
utilizzando il metodo di cui sopra? Sembra che dovrei usare foreach
. Ma quali sono i metodi o le proprietà Dictionary
che mi consentono di identificare dove si trova un elemento all'interno di un dizionario?
Se stai ancora leggendo questo, voglio anche sottolineare che non sto cercando di dire che c'è qualcosa di sbagliato con Dictionary
... Sto semplicemente cercando di capire come questo strumento nel quadro .NET funziona e come usarlo al meglio.
Se l'ordine è importante, utilizzare un altro tipo di raccolta diverso da un dizionario come elenco, pila, coda, matrice o [whathaveyou] (https://msdn.microsoft.com/en-us/library/System.Collections.Generic (v = vs.110) .aspx). Utilizzare un dizionario quando è richiesta una chiave di ricerca O (1) => valore. Non vedo perché ti interesserebbe l'elemento '" Count-1 "' 'th ad esempio; se sei un dizionario è * non * il tipo di raccolta che desideri utilizzare. – RobIII
L'ordine non è definito, quindi anche il valore di un indice specifico non è definito. L'unica ragione per cui ho potuto vedere volendo ottenere un indice specifico è l'accesso casuale agli elementi, e probabilmente c'è un modo migliore per farlo. – clcto
'Con il dizionario, come dovrei copiare ogni chiave in outStr usando il metodo sopra?' Presonalmente non userei quel metodo. 'var list = dictionary.Select (k => k.Key) .ToList();' è più semplice. –
Ulric