2013-02-06 15 views
28

Sono molto nuovo in .NET, abituato a lavorare in PHP. Ho bisogno di iterare tramite foreach attraverso un dizionario di oggetti. La mia configurazione è un'app MVC4.Ciclo attraverso l'oggetto dizionario

Il modello si presenta così:

public class TestModels 
{ 
    Dictionary<int, dynamic> sp = new Dictionary<int, dynamic> 
    { 
     {1, new {name="abc", age="1"}}, 
     {2, new {name="def", age="2"}} 
    } 
} 

Controller:

public class TestController : Controller 
{ 
    Models.TestModels obj = new Models.TestModels(); 
} 

Come faccio a ciclo attraverso l'oggetto obj e recuperare i valori del dizionario e stamparli in vista?

+2

possibile duplicato di [Qual è il modo migliore per iterare su un dizionario in C#?] (Http://stackoverflow.com/questions/141088/what-is-the-best-way-to-iterate -over-a-dictionary-in-c) – Jeremy

+2

(Ho votato anche come duplicato: basti ricordare che l'ordine di iterazione non è definito ..) –

risposta

49

Un modo è quello di ciclo tra le chiavi del dizionario, che consiglio:

foreach(int key in sp.Keys) 
    dynamic value = sp[key]; 

Un altro modo è quello di scorrere dizionario come una sequenza di coppie:

foreach(KeyValuePair<int, dynamic> pair in sp) 
{ 
    int key = pair.Key; 
    dynamic value = pair.Value; 
} 

I consiglia il primo approccio, perché puoi avere più controllo sull'ordine degli elementi recuperati se decori la proprietà Keys con le istruzioni LINQ appropriate, ad esempio, sp.Keys.OrderBy(x => x) ti aiuta a recuperare gli elementi in ordine crescente della chiave. Si noti che Dictionary utilizza internamente una struttura dati hash table, pertanto se si utilizza il secondo metodo l'ordine degli articoli non è facilmente prevedibile.

Aggiornamento (01 dic. 2016): sostituito var s con tipi reali per rendere la risposta più chiara.

+0

quindi deve essere fatto nella vista? Anche il valore conterrà entrambi i valori giusto? quindi devo solo fare value.0 e value.1 per stampare? – user1833222

+0

No. Lo faresti come nella mia risposta, o in base alla risposta di Sina la chiameresti usando "valore" e il nome che hai dato alla variabile, ad es. 'value.name' o' value.age'. – eandersson

+2

piccolo punto: renderebbe questo un po 'più facile capire se la parola chiave var non è stata utilizzata – Jezzamon

3

Dipende da che cosa siete dopo nel Dizionario

Models.TestModels obj = new Models.TestModels(); 

foreach (var keyValuPair in obj.sp) 
{ 
    // KeyValuePair<int, dynamic> 
} 

foreach (var key in obj.sp.Keys) 
{ 
    // Int 
} 

foreach (var value in obj.sp.Values) 
{ 
    // dynamic 
} 
1

Si può fare in questo modo.

Models.TestModels obj = new Models.TestModels(); 
foreach (var item in obj.sp) 
{ 
    Console.Write(item.Key); 
    Console.Write(item.Value.name); 
    Console.Write(item.Value.age); 
} 

Il problema è molto probabile che in questo momento è che la collezione è private. Se si aggiunge public all'inizio di questa linea

Dictionary<int, dynamic> sp = new Dictionary<int, dynamic> 

Si dovrebbe essere in grado di accedervi dalla funzione all'interno del vostro controller.

Modifica: Aggiunta di esempio funzionale dell'implementazione completa TestModels.

La classe TestModels dovrebbe essere simile a questa.

public class TestModels 
{ 
    public Dictionary<int, dynamic> sp = new Dictionary<int, dynamic>(); 

    public TestModels() 
    { 
     sp.Add(0, new {name="Test One", age=5}); 
     sp.Add(1, new {name="Test Two", age=7}); 
    } 
} 

probabilmente avrete bisogno di leggere sulla parola dynamic pure.

0
public class TestModels 
{ 
    public Dictionary<int, dynamic> sp = new Dictionary<int, dynamic>(); 

    public TestModels() 
    { 
     sp.Add(0, new {name="Test One", age=5}); 
     sp.Add(1, new {name="Test Two", age=7}); 
    } 
} 
+2

La risposta vale sicuramente una piccola spiegazione. Si prega di fare riferimento a http://stackoverflow.com/help/how-to-answer. –

Problemi correlati