Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
213 / 139 / 8
Регистрация: 18.08.2010
Сообщений: 1,018
1

Как получить доступ к полям элемента в коллекции в цикле foreach

14.11.2011, 22:42. Показов 2434. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть коллекция People классов Person, в которой доступ используется с помощью ключа. Если из мейна делать вот так:
C#
1
Console.WriteLine("{0}", collectionPeople["Ira"].Age);
то все пашет. Ну а если же попробовать пройтись по всей коллекции в цикле и там попробовать получить доступ к полю, то ругается компилятор.
C#
1
2
3
4
foreach (DictionaryEntry person in collectionPeople)
            {
                Console.WriteLine("{0}", person.Age);
            }
Почему? И как решить проблемку?


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace Task1_Collections
{
    public class Person
    {
        private string name;
        private int age;
        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
            }
        }
        public int Age
        {
            get
            {
                return age;
            }
            set
            {
                age = value;
            }
        }
        public Person(string Name, int Age)
        {
            name = Name;
            age = Age;
        }
    }
 
    class People : DictionaryBase
    {
        public void Add(string newName, Person newPerson)
        {
            Dictionary.Add(newName, newPerson);
        }
 
        public void Remove(string animalID)
        {
            Dictionary.Remove(animalID);
        }
 
        public People()
        {
        }
 
        public Person this[string personName]
        {
            get
            {
                return (Person)Dictionary[personName];
            }
            set
            {
                Dictionary[personName] = value;
            }
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            People collectionPeople = new People();
            Person person1 = new Person("Tolya", 21);
            collectionPeople.Add(person1.Name, person1);
 
            Person person2 = new Person("Ira", 19);
            Person person3 = new Person("Sergiyko", 18);
            Person person4 = new Person("Dmytryk", 20);
 
            collectionPeople.Add(person2.Name, person2);
            collectionPeople.Add(person3.Name, person3);
            collectionPeople.Add(person4.Name, person4);
 
            foreach (DictionaryEntry person in collectionPeople)
            {
                Console.WriteLine("{0}", person.Value);
            }
            Console.WriteLine("{0}", collectionPeople["Ira"].Age);
            Console.ReadKey();
        }
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.11.2011, 22:42
Ответы с готовыми решениями:

Не получается при прохождении по коллекции через foreach получить доступ к этим полям
Добрый день. Есть коллекция<object>, которая содержит экземпляры различных классов. У классов...

Доступ из элемента коллекции к другим элементам коллекции
Подскажите как получить данные из другого элемента коллекции? В приведенном примере необходимо...

Как удалить элемент из коллекции, во время перебора этой коллекции foreach?
Прив. Смотрите что. Есть сервер, на нем 2 класса - Server & ClientConnection. При подключении...

Как получить доступ ко всем полям объекта
Вообщем есть у меня объект, который содержит много полей в том числе большие массивы данных, я...

4
Эксперт .NET
17790 / 12941 / 3381
Регистрация: 17.09.2011
Сообщений: 21,215
14.11.2011, 23:02 2
DictionaryBase - не строго типизированный класс, потому все значения хранятся как ссылка на object.
Следовательно, в цикле надо привести значение к нужному типу:

C#
1
2
3
4
5
foreach (DictionaryEntry person in collectionPeople)
            {
                var p = person.Value as Person;
                Console.WriteLine("{0}", p.Age);
            }
Как вариант, в классе Person переопределить метод ToString, тогда для вывода в консоль приводить к нужному типу не потребуется.
1
213 / 139 / 8
Регистрация: 18.08.2010
Сообщений: 1,018
15.11.2011, 00:31  [ТС] 3
Точно!!! Что-то я совсем не в ту сторону думал) Спасибо большое за помощь!

P.S. Попробовал сделать приведение в одной строчке.
C#
1
Console.WriteLine("{0}", ((Person)person.Value).Age);
Добавлено через 1 час 6 минут
Еще вопросик один... Пытаюсь получить массив объектов People, возраст Age которых равен максимальному возрасту maxAge.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public People GetOldest()
        {
            People OldestPeople = new People();
            int maxAge = GetMaxAge();
            foreach (DictionaryEntry person in this)
            {
                if (((Person)person.Value).Age == maxAge)
                {
                    this.Add(((Person)person.Value).Name, person as Person);
                }
            }
            return OldestPeople;
        }
Но строчка приведения, что в цикле в условии if, не пашет... Почему? Я же уже сделал приведение к типу...
Пробовал также вот так:
C#
1
this.Add(((Person)person.Value).Name, (Person)person.Value);
Не пойму, почему ругается, что Cannot convert type 'System.Collections.DictionaryEntry' to 'Task1_Collections.Person'.
0
Эксперт .NET
17790 / 12941 / 3381
Регистрация: 17.09.2011
Сообщений: 21,215
15.11.2011, 00:45 4
Потому что переменная person, объявленная в foreach, является типом DictionaryEntry.
Замените ее на person.Value as Person

Во избежание следующего вопроса.
Вот эта строчка:
C#
1
this.Add(((Person)person.Value).Name, person.Value as Person);
Наверное должна выглядеть так:
C#
1
OldestPeople.Add(((Person)person.Value).Name, person.Value as Person);
1
213 / 139 / 8
Регистрация: 18.08.2010
Сообщений: 1,018
15.11.2011, 00:51  [ТС] 5
kolorotur, спасибо огромное! я просто новичек еще во всем этом. Разбираюсь...

Цитата Сообщение от kolorotur Посмотреть сообщение
Вот эта строчка:
C#
1
this.Add(((Person)person.Value).Name, person.Value as Person);
Наверное должна выглядеть так:
C#
1
OldestPeople.Add(((Person)person.Value).Name, person.Value as Person);
Да, точно! Это моя уже машинальная ошибка)
0
15.11.2011, 00:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.11.2011, 00:51
Помогаю со студенческими работами здесь

Как получить тип элемента обобщенной коллекции?
Добрый день, господа! Столкнулся с нетривиальной задачей: как получить тип элемента коллекции...

Доступ к переменной в цикле foreach
Здравствуйте! Есть ассоциативный массив $Arr = array('k1'=>$V1, 'k2'=>$V2, 'k3'=>$V3...); В этом...

Как получить доступ к полям внешнего класса
Всем доброго времени суток. Помогите, пожалуйста, разобраться: Моя проблема в упрощённом виде:...

Как получить доступ к полям формы в POST?
Ситуация такая: на форму динамически добавляются поля, имеющие одинаковое имя - нужно получить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru