2013-02-06 18 views
28

Jestem bardzo nowy w .NET, używany do pracy w PHP. Muszę iterować przez foreach poprzez słownik obiektów. Moja konfiguracja to aplikacja MVC4.Pętla przez obiekt słownikowy

Model wygląda następująco:

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

Kontroler:

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

Jak pętli obiektu obj i pobierać wartości słownika i wydrukować je w widoku?

+2

możliwe duplikat [Co to jest najlepszym sposobem iteracyjne nad Dictionary w C#?] (Http://stackoverflow.com/questions/141088/what-is-the-best-way-to-iterate -over-a-słownik-in-c) – Jeremy

+2

(Głosowałem również jako duplikat: pamiętaj, że kolejność iteracji nie jest zdefiniowana ..) –

Odpowiedz

49

Jednym ze sposobów jest pętli kluczy słownika, które zalecają:

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

Innym sposobem jest pętli słownika jako sekwencja par:

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

I zalecane pierwsze podejście, ponieważ możesz mieć większą kontrolę nad kolejnością elementów, które zostały pobrane, jeśli udekorujesz właściwość Keys właściwymi instrukcjami LINQ, np. sp.Keys.OrderBy(x => x) pomaga odzyskać elementy w porządku rosnącym klucza. Zauważ, że Dictionary używa wewnętrznie struktury danych hash table, dlatego jeśli użyjesz drugiej metody, kolejność pozycji nie jest łatwa do przewidzenia.

Aktualizacja (01 grudnia 2016 r.): zastąpiono var s rzeczywistymi typami, aby odpowiedź była bardziej przejrzysta.

+0

więc należy to zrobić w widoku? Również wartość będzie zawierać obie wartości w prawo? więc po prostu muszę zrobić wartość.0 i wartość.1, aby wydrukować? – user1833222

+0

Nie. Powinieneś zrobić to tak, jak w mojej odpowiedzi, lub na podstawie odpowiedzi Siny nazwałbyś to za pomocą "wartości" i nazwy, którą dałeś zmiennej, np. "value.name" lub "value.age". – eandersson

+2

mały punkt: byłoby to trochę łatwiejsze do zrozumienia, jeśli słowo kluczowe var nie zostało użyte – Jezzamon

3

To zależy od tego, czego po w Słowniku

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

Można zrobić to w ten sposób.

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); 
} 

Problem najprawdopodobniej mają teraz jest to, że kolekcja jest private. Jeśli dodać public do początku tej linii

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

Powinieneś być w stanie uzyskać do niego dostęp z funkcji wewnątrz kontrolera.

Edytuj: Dodawanie funkcjonalnego przykładu pełnej implementacji TestModels.

Twoja klasa TestModels powinna wyglądać mniej więcej tak.

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}); 
    } 
} 

Prawdopodobnie chcesz przeczytać również słowo kluczowe dynamic.

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

Twoja odpowiedź z pewnością warta jest trochę wyjaśnienia. Prosimy zapoznać się z http://stackoverflow.com/help/how-to-answer. –