Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
 Аватар для Pro100Tom
154 / 31 / 11
Регистрация: 29.10.2012
Сообщений: 397

Итерации структур и списков

02.05.2014, 22:38. Показов 2530. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, друзья. Никогда не думал, что не разберусь сам. Могу конечно устроить танцы с бубном, но реально хочется узнать "правильный" подход. Смотрите, у меня есть структура. В этой структуре есть 3 списка обычных целых чисел. Я хочу пройтись по всем числам (foreach), но не могу этого сделать, потому что сначала нужно пройтись по каждому из списков в структуре. Если я пишу так:
C#
1
foreach(List<int> connectionType in currentStop.connections)
выдаёт ошибку
Code
1
Error   1   foreach statement cannot operate on variables of type 'project.Connections' because 'project.Connections' does not contain a public definition for 'GetEnumerator'
Я предполагаю, что нужно использовать интерфейс IEnumerable потому что "компьютер" не знает как листать внутри структуры. Подскажите пожалуйста, как нужно решать такую проблему. Если нужно использовать IEnumerable, то в двух словах объясните, как именно он работает и почему без него vs выдаёт ошибку. Заранее спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.05.2014, 22:38
Ответы с готовыми решениями:

Почему на каждой итерации элементы всех структур переписываются новыми?
Я полагал, что коллекция theSupplies будет хранить структуры, и на каждой итерации туда будет запиливаться новый набор. Но оказалось, что...

Визуализация, отрисовка графов, деревьев, списков, структур. Библиотеки визуализации под WPF.
Недавно столкнулся с проблемой поиска подходящих средств для отрисовки графов, списков, деревьев и т.п. структур. Слышал про отдельную...

Организация списков путём применения указателей и структур
Помогите, пожалуйста! Есть программа, в программе у меня допущены ошибки, как поправить, непонятно! Задание: &quot;Дан список...

14
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
02.05.2014, 22:52
Pro100Tom, у вас именно структура или класс?
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
02.05.2014, 22:58
Цитата Сообщение от Pro100Tom Посмотреть сообщение
currentStop.connections
Что возвращает? (какой тип?)

Добавлено через 3 минуты
Перебирайте по очереди все 3 списка и все. В любом случае они все последовательно будут перебираться. Либо засуньте в одну коллекцию и переребирайте.
1
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
02.05.2014, 22:59
Pro100Tom, вот вариант с классом и именованным итератором внутри. В зависимости от индекса перебирается первый, второй или третий лист.
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
using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            MyClass ms=new MyClass();
            foreach(int i in ms.GetMyEnumerator(3))
            {
                Console.WriteLine(i);
            }
            Console.ReadLine();
        }
    }
    public class MyClass
    {
        List<int> list1;
        List<int> list2;
        List<int> list3;
 
        public MyClass()
        {
            list1 = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            list2 = new List<int>() { 10, 20, 30, 40, 50, 60, 70, 80, 90 };
            list3 = new List<int>() { 100, 200, 300, 400, 500, 600, 700, 800 };
        }
        public IEnumerable<int> GetMyEnumerator(int index)
        {
            switch (index)
            {
                case 1:
                    {
                        foreach (int i in list1)
                            yield return i;
                    }
                    break;
                case 2:
                    {
                        foreach (int i in list2)
                            yield return i;
                    }
                    break;
                case 3:
                    {
                        foreach (int i in list3)
                            yield return i;
                    }
                    break;
                default:
                    break;
            }
        }
    }
}
1
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
02.05.2014, 23:17
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
public struct SomeStruct: IEnumerable
    {
        List<int> list1;
        List<int> list2;
        List<int> list3;
 
        public SomeStruct(List<int> list1, List<int> list2, List<int> list3) 
        {
            this.list1 = list1;
            this.list2 = list2;
            this.list3 = list3;
        }
 
 
        public IEnumerator GetEnumerator()
        {
            list1.AddRange(list2);
            list1.AddRange(list3);
            return list1.GetEnumerator();
        }
    }
... 
// Main
var list1 = Enumerable.Range(1, 10).ToList();
            var list2 = Enumerable.Range(1, 10).ToList();
            var list3 = Enumerable.Range(1, 10).ToList();
            var structure = new SomeStruct(list1, list2, list3);
            foreach (int variable in structure)
            {
                Console.WriteLine(variable);
            }
 
 
            Console.ReadKey();
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
02.05.2014, 23:23
IamRain, хорошее решение, но я так не стал.
1. Вероятно, что ТС надо сначала пройтись по каждому из листов.
2. В листе 1 окажутся все данные, что может как быть, так и не быть проблемой.
Ждем ответа ТС.
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
02.05.2014, 23:26
мм, правда лучше так не делать.
А вот так:
C#
1
2
3
4
5
6
7
8
public IEnumerator GetEnumerator()
        {
            var list = new List<int>();
            list.AddRange(list1);
            list.AddRange(list2);
            list.AddRange(list3);
            return list.GetEnumerator();
        }
Добавлено через 2 минуты
Цитата Сообщение от insite2012 Посмотреть сообщение
Вероятно, что ТС надо сначала пройтись по каждому из листов.
Ну так и проходит по каждому из листов, надо будет - break всегда можно сделать. И по-моему, ТС пока ничего не надо.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
02.05.2014, 23:28
Да, так лучше. Но возможность пройтись только сразу по всему содержимому листов остается. Наверное, надо бы совместить наши версии, тогда будет полный функционал. Именованный итератор и реализация IEnumerable<int>.

Добавлено через 38 секунд
Цитата Сообщение от IamRain Посмотреть сообщение
проходит по каждому из листов
Я имел ввиду по отдельности.

Добавлено через 53 секунды
Цитата Сообщение от IamRain Посмотреть сообщение
ТС пока ничего не надо.
Он в ожидании. Пока тут выработают решение.
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
02.05.2014, 23:35
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
           struct CurrentStop 
            {
 
                public CurrentStop(List<int> list1, List<int> list2, List<int> list3)
                {
                    this.list1 = list1;
                    this.list2 = list2;
                    this.list3 = list3;
                }
 
 
                private List<int> list1;
                private List<int> list2;
                private List<int> list3;
 
                public System.Collections.IEnumerable Connections
                {
                    get
                    {
                        yield return list1;
                        yield return list2;
                        yield return list3;
                    }
                }
            }
 
            static void Main(string[] args)
            {
                /////
              
                ////
                var currentStop = new CurrentStop(list1, list2, list3);
                foreach (List<int> connectionType in currentStop.Connections)
                    foreach (int item in connectionType)
                        Console.WriteLine(item);
                Console.ReadKey();            
        }
1
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
02.05.2014, 23:39
Цитата Сообщение от MrCold Посмотреть сообщение
C#
1
2
3
4
5
6
7
8
9
public System.Collections.IEnumerable Connections
                {
                    get
                    {
                        yield return list1;
                        yield return list2;
                        yield return list3;
                    }
                }
Неплохо, но тут уже два foreach-а.
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
02.05.2014, 23:43
Возможно не понял что требуется из-за этой строки
Цитата Сообщение от Pro100Tom Посмотреть сообщение
foreach(List<int> connectionType
0
 Аватар для Pro100Tom
154 / 31 / 11
Регистрация: 29.10.2012
Сообщений: 397
03.05.2014, 01:17  [ТС]
Спасибо всем большое за ответы.
Цитата Сообщение от insite2012 Посмотреть сообщение
Pro100Tom, у вас именно структура или класс?
У меня структура.
C#
1
2
3
4
5
6
struct Connections
    {
        public List<int> taxi;
        public List<int> bus;
        public List<int> underground;
    }
Цитата Сообщение от IamRain Посмотреть сообщение
Что возвращает? (какой тип?)
Code
1
currentStop
это instance класса Stop
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Stop
    {
        public PointF coordinates;
        public int number;
        public Connections connections;
        public Accessibility accessibility;
        public bool isSelected;
        public GraphicsPath path;
        private static int _diameter;
 
        public Stop()
        {
            this.connections.taxi = new List<int>();
            this.connections.bus = new List<int>();
            this.connections.underground = new List<int>();
            this.path = new GraphicsPath();
        } ...
Эта структура находится в одном файле вместе с классом Stop. А тип..? А как узнать какой это тип-то? Это просто класс с кучей переменных и парой структур. Простите, если туплю. Я думал сделать 3 цикла отдельно, но подумал, что это не самый оптимальный вариант. P.S. Что такое "ТС"?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
03.05.2014, 01:27
Pro100Tom, во-первых вместо структуры используйте класс. У вас экономия нескольких десятков байт в куче может обернуться кучей трудноуловимых ошибок из-за мутабельности.

во-вторых для Connections нужно определить интерфейс IEnumerable<int>, ну и как-то возвращать какие-то значения (из одного списка, из всех списков, тут уж вам виднее)

Добавлено через 3 минуты
insite2012, что касается этого вашего кода, вы что-то перемудрили с итератором
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
        public IEnumerable<int> GetMyEnumerator(int index)
        {
            switch (index)
            {
            case 1:
                return list1;
            case 2:
                return list2;
            case 3:
                return list3;
            }
            return Enumerable.Empty<int>();
        }
1
 Аватар для Pro100Tom
154 / 31 / 11
Регистрация: 29.10.2012
Сообщений: 397
03.05.2014, 02:12  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
        public IEnumerable<int> GetMyEnumerator(int index)
        {
            switch (index)
            {
            case 1:
                return list1;
            case 2:
                return list2;
            case 3:
                return list3;
            }
            return Enumerable.Empty<int>();
        }
Если я не ошибаюсь, то это ведь самый обычный метод? Он ведь вполне может работать без IEnumerable. Как я понимаю, если implement'ить этот интерфейс, то можно листать путём foreach. А тут этот метод просто возвращает списки. Я хотел бы узнать, что нужно сделать, чтобы можно было так листать. Спасибо еще раз за ответы, и я воспользуюсь switch/case скорее всего, но мне просто из любопытства интересно как сделать так, чтобы такой код работал?
C#
1
2
3
4
5
6
7
foreach (List<int> connectionType in currentStop.connections)
            {
                foreach (int number in connectionType)
                {
                    openList.Add(new Stop(stops.First(s => s.number == number)));
                }
            }
А почему структуры лучше не использовать?

Добавлено через 13 минут
Виноват, не заметил ответа одного. Извиняюсь!
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
03.05.2014, 14:14
Цитата Сообщение от Pro100Tom Посмотреть сообщение
Спасибо еще раз за ответы, и я воспользуюсь switch/case скорее всего, но мне просто из любопытства интересно как сделать так, чтобы такой код работал?
C#
1
2
3
4
5
6
7
public List<int>[] connections
{
   get
   {
      return new[] {con.taxi, con.bus, con.underground}
   }
}
Добавлено через 5 минут
Цитата Сообщение от Pro100Tom Посмотреть сообщение
А почему структуры лучше не использовать?
не знаю, поняли ли вы или нет, но лучше всего ответ на этот вопрос описан в этой и этой статьях.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.05.2014, 14:14
Помогаю со студенческими работами здесь

Изучение динамических структур данных на примере односвязных списков, процедур для выделения и освобождения памяти
помогите пожалуйста вот задание Сформировать односвязный список из 5 записей, удалить записи, удовлетворяющие некоторому...

Объединение 2 и более списков в список списков по индексу без использования циклов
Уважаемые товарищи, подскажите есть ли способ объединения 2 и более списков в список списков по индексу без использования циклов. К примеру...

Как сложить сумму из чисел сотен списков и узнать количество списков?
Доброго времени суток! Не могу понять как сложить сумму из несколько тысяч списков. Подскажите пожалуйста? В коде удалил из списков все...

Как из двух списков сделать один список кортежей/списков
Доброго времени суток! Буду очень благодарен, если поможете из двух списков, к примеру a и b, сделать список c, который содержит пары...

Копирование данных двумерного массива состоящего из списков в список списков.
Для нахождения МСТ (минимального остового дерева) написал функцию, которая принимает масив - гарф. private List&lt;Point&gt;...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в КА2. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа в КА2. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru