2015-05-11 4 views
-2

Я пытаюсь выполнить итерацию через словарь и создать новый текстовый блок для каждого элемента в словаре, основываясь на конкретном свойстве в каждом объекте в словаре. Тем не менее, при повторении, он только когда-либо находит последний добавленный объект, а затем повторяет это для многих объектов в словаре. то есть у меня будет 4 текстовых блока с одинаковым текстом, если у меня есть 4 объекта. Может кто подскажет, где я иду не так? Вот мой код:Итерация через словарь не работает должным образом

foreach (KeyValuePair<string, MyObjects> entry in MyDictionary) 
{ 
    MyTextblock = new TextBlock(); 
    MyTextblock.Margin = new Thickness(0, 5, 0, 0); 
    MyStackPanel.Children.Add(MyTextblock); 
    MyTextblock.Text = MyObjects.name; 
} 
+0

Я должен добавить, что при отладке я могу видеть правильное количество объектов и свойств в словаре – Ricardinho

+2

Вы не используете 'entry' в цикле? Должно ли это быть «entry.Value.name»? –

+0

Для этого кода для компиляции вообще свойство 'name' должно быть статичным в классе, а это значит, что у вас нет имени для каждой записи. Все записи имеют одно и то же имя, поэтому, когда вы устанавливаете имя для последней записи, это также будет имя для всех предыдущих записей. Даже если вы используете 'entry.Value.name' вместо' MyObjects.name', имя будет по-прежнему совпадать. Для того, чтобы каждая запись имела собственное имя, вам нужно иметь нестатическое свойство. – Guffa

ответ

3

Вы должны использовать объект ввода подобного:

foreach (KeyValuePair<string, MyObjects> entry in MyDictionary) 
{ 
    MyTextblock = new TextBlock(); 
    MyTextblock.Margin = new Thickness(0, 5, 0, 0); 
    MyStackPanel.Children.Add(MyTextblock); 
    MyTextblock.Text = entry.Value.name; 
} 
+0

и Джеймс Торп. Спасибо вам обоим! Это была проблема ... теперь она работает :) – Ricardinho

0

Более правильным способом было бы итерацию по коллекции Словарь Keys:

foreach (string Key in MyDictionary.Keys) 
{ 
    MyTextblock = new TextBlock(); 
    MyTextblock.Margin = new Thickness(0, 5, 0, 0); 
    MyStackPanel.Children.Add(MyTextblock); 
    MyTextblock.Text = MyDictionary[Key].name; 
} 

И даже лучший вариант в этом случае, так как ваш цикл, похоже, не использует ключ в любом месте, - это перебирать коллекцию Values:

foreach (MyObjects Value in MyDictionary.Values) 
{ 
    MyTextblock = new TextBlock(); 
    MyTextblock.Margin = new Thickness(0, 5, 0, 0); 
    MyStackPanel.Children.Add(MyTextblock); 
    MyTextblock.Text = Value.name; 
} 
+0

Как это лучше? Вы выполняете дополнительный поиск на итерацию. – dcastro

+0

@dcastro: См. Мой отредактированный ответ. –

Смежные вопросы