[c#] Qual è il modo migliore per scorrere su un dizionario in C #?


Answers

Se stai cercando di utilizzare un dizionario generico in C # come si usa un array associativo in un'altra lingua:

foreach(var item in myDictionary)
{
  foo(item.Key);
  bar(item.Value);
}

Oppure, se hai solo bisogno di iterare sulla collezione di chiavi, usa

foreach(var item in myDictionary.Keys)
{
  foo(item);
}

E infine, se sei interessato solo ai valori:

foreach(var item in myDictionary.Values)
{
  foo(item);
}

(Prendi nota che la parola chiave var è una caratteristica C # 3.0 opzionale e sopra, puoi anche usare il tipo esatto di chiavi / valori qui)

Question

Ho visto alcuni modi diversi per scorrere su un dizionario in C #. C'è un modo standard?




Il modo standard per scorrere su un dizionario, secondo la documentazione ufficiale su MSDN è:

foreach (DictionaryEntry entry in myDictionary)
{
     //Read entry.Key and entry.Value here
}



Dipende se stai cercando le chiavi o i valori ...

Dal Dictionary(TKey, TValue) MSDN Dictionary(TKey, TValue) Descrizione della classe:

// When you use foreach to enumerate dictionary elements,
// the elements are retrieved as KeyValuePair objects.
Console.WriteLine();
foreach( KeyValuePair<string, string> kvp in openWith )
{
    Console.WriteLine("Key = {0}, Value = {1}", 
        kvp.Key, kvp.Value);
}

// To get the values alone, use the Values property.
Dictionary<string, string>.ValueCollection valueColl =
    openWith.Values;

// The elements of the ValueCollection are strongly typed
// with the type that was specified for dictionary values.
Console.WriteLine();
foreach( string s in valueColl )
{
    Console.WriteLine("Value = {0}", s);
}

// To get the keys alone, use the Keys property.
Dictionary<string, string>.KeyCollection keyColl =
    openWith.Keys;

// The elements of the KeyCollection are strongly typed
// with the type that was specified for dictionary keys.
Console.WriteLine();
foreach( string s in keyColl )
{
    Console.WriteLine("Key = {0}", s);
}



var dictionary = new Dictionary<string, int>
{
    { "Key", 12 }
};

var aggregateObjectCollection = dictionary.Select(
    entry => new AggregateObject(entry.Key, entry.Value));



Direi che foreach è il modo standard, anche se ovviamente dipende da cosa stai cercando

foreach(var value in my_dictionary) {
  ...
}

E 'quello che stai cercando?




Hai suggerito di seguito per iterare

Dictionary<string,object> myDictionary = new Dictionary<string,object>();
//Populate your dictionary here

foreach (KeyValuePair<string,object> kvp in myDictionary) {
    //Do some interesting things;
}

Cordiali saluti, foreach non funziona se il valore è di tipo oggetto.







Con .NET Framework 4.7 si può usare la decomposizione

var fruits = new Dictionary<string, int>();
...
foreach (var (fruit, number) in fruits)
{
    Console.WriteLine(fruit + ": " + number);
}

Per fare in modo che questo codice funzioni su versioni C # inferiori, aggiungi il System.ValueTuple NuGet package e scrivi da qualche parte

public static class MyExtensions
{
    public static void Deconstruct<T1, T2>(this KeyValuePair<T1, T2> tuple,
        out T1 key, out T2 value)
    {
        key = tuple.Key;
        value = tuple.Value;
    }
}



Volevo solo aggiungere il mio 2 cent, in quanto la maggior parte delle risposte si riferiscono al ciclo foreach. Per favore, dai un'occhiata al seguente codice:

Dictionary<String, Double> myProductPrices = new Dictionary<String, Double>();

//Add some entries to the dictionary

myProductPrices.ToList().ForEach(kvP => 
{
    kvP.Value *= 1.15;
    Console.Writeline(String.Format("Product '{0}' has a new price: {1} $", kvp.Key, kvP.Value));
});

Anche se questo aggiunge un ulteriore richiamo di ".ToList ()", potrebbe esserci un leggero miglioramento delle prestazioni (come indicato qui foreach vs someList.Foreach () {} ), in modo particolare quando si lavora con Dizionari di grandi dimensioni e si esegue in parallelo non c'è opzione / non avrà alcun effetto.

Inoltre, tieni presente che non sarai in grado di assegnare valori alla proprietà 'Value' all'interno di un ciclo foreach. D'altra parte, sarete in grado di manipolare anche la 'Chiave', eventualmente mettendovi nei guai in fase di runtime.

Quando si desidera solo "leggere" chiavi e valori, è possibile utilizzare anche IEnumerable.Select ().

var newProductPrices = myProductPrices.Select(kvp => new { Name = kvp.Key, Price = kvp.Value * 1.15 } );



Ci sono molte opzioni. Il mio preferito è KeyValuePair

Dictionary<string, object> myDictionary = new Dictionary<string, object>();
// Populate your dictionary here

foreach (KeyValuePair<string,object> kvp in myDictionary)
{
     // Do some interesting things
}

Puoi anche utilizzare le raccolte di chiavi e valori




Related