Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Вывод текущего элемента масива


Автор: N1ko 30.6.2009, 23:42
Код

            DirectoryInfo main_dir = new DirectoryInfo(@"D:\Music\");
            DirectoryInfo[] my = main_dir.GetDirectories();
            foreach (DirectoryInfo i in my)
            {
                // Здесь нужно определить текущий элемент и вывести в MessageBox
                // Как это сделать?
                
            }

Автор: Lirius 1.7.2009, 07:33
Код

 DirectoryInfo main_dir = new DirectoryInfo(@"D:\test_pic\");
            DirectoryInfo[] my = main_dir.GetDirectories();
            foreach (DirectoryInfo i in my)
            {
                // Заменить на MessageBox.Show();
                Console.WriteLine(i.Name);

            }

Автор: N1ko 1.7.2009, 18:19
Я извеняюсь. Немного неправильно сформулировал вопрос. Как вывести номер текущего элемента? С названием понятно.

Автор: Экскалупатор 1.7.2009, 18:46
N1ko, а просто посчитать?

Автор: Экскалупатор 1.7.2009, 20:23
если вместо 
Код

foreach (DirectoryInfo i in my)
            {
                // Заменить на MessageBox.Show();
                Console.WriteLine(i.Name);
            }



сделать так:
Код

for (int i=0; i<my.Length; i++)
            {    
                // Заменить на MessageBox.Show();
                Console.WriteLine(my[i].Name);
                Console.WriteLine("номер текущего элемента = " + i.ToString());
            }


то номер будет известен постоянно, хотя может можно и через foreach сделать...

Автор: N1ko 1.7.2009, 21:15
Я понимаю что так можно сделать. Ещё внутрь foreach можно вставить счётчик, который при каждом прохождении цикла будет наращиваться на один. Но возможно существуют встроенные методы у foreach для выведения текущей позиции? Сколько я не пробовал, не получалось.

Автор: Heinzz 1.7.2009, 21:35
Код

DirectoryInfo main_dir = new DirectoryInfo(@"C:\Music\");
            DirectoryInfo[] my = main_dir.GetDirectories();
            List<DirectoryInfo> list = my.ToList();
            foreach (DirectoryInfo i in list)
            {
                Console.WriteLine(list.IndexOf(i));
            }
            Console.ReadKey();

Это вариант без счетчиков

Автор: mihryak 1.7.2009, 22:07
Цитата(Heinzz @  1.7.2009,  22:35 Найти цитируемый пост)

Это вариант без счетчиков 

зато на каждой итерации будет происходить поиск текущего элемента в коллекции. браво!

Автор: Экскалупатор 1.7.2009, 23:48

http://msdn.microsoft.com/ru-ru/magazine/cc163323.aspx

Автор: Heinzz 2.7.2009, 11:47
Цитата(Heinzz @  1.7.2009,  22:35 Найти цитируемый пост)

Это вариант без счетчиков 
зато на каждой итерации будет происходить поиск текущего элемента в коллекции. браво!


Ну хозяин-барин, надо индекс - пожалуйста!
Про скорострельность никто не говорил, а ежели это нужно для обзора подкаталогов, то она тут непринципиальна.

Автор: mihryak 2.7.2009, 12:24
Цитата(Heinzz @  2.7.2009,  12:47 Найти цитируемый пост)
Про скорострельность никто не говорил

нет, не говорил
но есть такие способы решения задачи, которые вне зависимости от требований к скорости-памяти будут неприемлимыми.
твой способ один из них, извини за прямоту
плохой код всегда плохой

Автор: gambit 3.7.2009, 09:52
mihryak, как то можно подцепить интерфейс foreach и самому его реализовать, тогда тебе будет доступен индекс текущего эллемента.

Автор: Экскалупатор 3.7.2009, 10:01
Цитата

mihryak, как то можно подцепить интерфейс foreach и самому его реализовать, тогда тебе будет доступен индекс текущего эллемента.

вот http://msdn.microsoft.com/ru-ru/magazine/cc163323.aspx написано, (я же уже давал ссылку)

Автор: PashaPash 3.7.2009, 14:01
Цитата(N1ko @  1.7.2009,  21:15 Найти цитируемый пост)
Я понимаю что так можно сделать. Ещё внутрь foreach можно вставить счётчик, который при каждом прохождении цикла будет наращиваться на один. Но возможно существуют встроенные методы у foreach для выведения текущей позиции? Сколько я не пробовал, не получалось. 

foreach предназначен для "пробегания" по IEnumerable. По IEnumerable, в общем случае, можно пройти только в одном направлении. Кроме того, IEnumerable не гарантирует что последовательность до и после текущего элемента вообще существуетю. Понятия "текущая позиция" тоже нет, есть только "текущий елемент". Аналог foreach по IEnumerable в реальной жизни - гопник Вася ест семки. Он точно знает что за семка у него в руке (Current). Он так же может взять следующую семку (MoveNext). Но он явно не знает порядковый номер текщей семки.

Хочешь текущего индекса при проходе по массиву - используй for. 

Экскалупатор, по ссылке текущий индекс в ArrayEnumerator - это private-поле в private class. Не слишком удобно. С другой стороны - не зря его так глубоко спрятали.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)