Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
Refactor
96 / 89 / 29
Регистрация: 05.03.2010
Сообщений: 231
1

Прошу предложить лучший вариант перебора массива

10.04.2011, 03:16. Просмотров 2844. Ответов 14
Метки нет (Все метки)

Всем доброго дня, такой вопросик.


есть массив

C#
1
int[] array = { 1, 2, 3, 4, 5, 6, 7 };

есть цикл foreach который выводит этот массив

C#
1
2
3
4
            foreach (var i in array)
            {
                Console.WriteLine(i);
            }
теперь вопрос, как можно в рукопашную изменить массив так, чтобы при передачи его ТОЛЬКО В ЦИКЛ foreach, он выводился задом наперед, т.е. 7,6,5,4,3,2,1 (в данном случае)

т.е. нужно изменить массив до цикла foreach.
  1. вопрос имеет чисто учебный характер
  2. нельзя применять любые встроенные методы C#
  3. сортировать массив не нужно
  4. также нужно чтобы способ работал при любой длине массива с числами
  5. в качестве примера можно взять допустим и такой массив int[] array = { 65, 2, 63, 4, 9, 32, 6 };




вот код как сам реализовал, но уверен что есть способы гораздо лучше
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
   class Program
    {
 
        static void Main(string[] args)
        {
            int[] array = { 1, 2, 3, 4, 5, 6, 7 };
 
            Masorybka(array);
 
            foreach (var i in array)
            {
                Console.WriteLine(i);
            }
            Console.ReadLine();
        }
 
        private static void Masorybka(int[] mass)
        {
            int dlina = mass.Length - 1;
            int delta = 0;
 
            if ((dlina & 1) == 0)
            {
                for (int i = 0; i < mass.Length - 1; i++)
                {
                    if ((mass.Length - 1) / 2 <= i)
                        continue;
 
                    dlina -= delta;
                    int temp = mass[i];
                    mass[i] = mass[dlina];
                    mass[dlina] = temp;
 
                    if (i == 0)
                        delta = 1;
                }
            }
            else
            {
                for (int i = 0; i < mass.Length - 1; i++)
                {
                    if ((mass.Length - 1) / 2 + 1 <= i)
                        continue;
 
                    dlina -= delta;
 
                    int temp = mass[i];
                    mass[i] = mass[dlina];
                    mass[dlina] = temp;
 
                    if (i == 0)
                        delta = 1;
                }
            }
        }
    }
т.е. какие числа в массиве не важно, просто надо их перевернуть в обратном порядке, заранее благодарен за варианты.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.04.2011, 03:16
Ответы с готовыми решениями:

Лучший вариант записи в .txt
Кто нить замерял как лучше вносить данные в текстовый фаил На данный момент из списка закидываю в...

Лучший вариант для работы с Modbus
Здравствуйте. Внезапно у меня появилась задача: организовать передачу данных от приложения с...

Разделение цикла for на маленькие методы - какой лучший вариант по производительности?
Что лучше с точки зрения быстродействия и производительности? Цикл в одном месте, а дальше в...

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

Какой вариант можете предложить?
Хочу создать городской сайт. Чтобы дополнительно на нем был софт для скачивания, и информационные...

14
wade25
145 / 145 / 3
Регистрация: 25.03.2011
Сообщений: 512
10.04.2011, 08:56 2
Я наверно не понял задания, но если просто перевернуть массив то

C#
1
2
3
 int[] mas = { 1, 2, 3, 4, 5, 6, 7 };
            for (int i = mas.Length - 1; i >= 0; i--)
                Console.Write(mas[i]);
0
Петррр
6177 / 3478 / 898
Регистрация: 28.10.2010
Сообщений: 5,928
10.04.2011, 09:00 3
C#
1
2
3
4
5
6
7
int[] array = { 1, 2, 3, 4, 5, 6, 7 };
System.Array.Reverse(array);
foreach (var i in array)
{
    Console.WriteLine(i);
}
Console.ReadKey(true);
Добавлено через 1 минуту
Извеняюсь, не прочитал п. 2
0
Refactor
96 / 89 / 29
Регистрация: 05.03.2010
Сообщений: 231
10.04.2011, 09:50  [ТС] 4
Спасибо за ответы, но в случае wade25 вы просто прошлись по массиву начиная сконца, при этом если же этот массив теперь передать в цикл foreach, и пройтись по нему от 0 до n-1, цифры опять выведуться в обычном порядке, т.е. массив не был перевернут вами до цикла foreach.

Петррр - вы правильно меня поняли, только вы не вручную перевернули массив а при помощи метода System.Array.Reverse()
0
10.04.2011, 09:50
SSV
Заблокирован
10.04.2011, 10:24 5
C#
1
2
3
4
5
6
7
8
9
10
int[] array = { 1, 2, 3, 4, 5, 6, 7 };
            int[] arrayReverse = new int[array.Length];
            for (int i = array.Length - 1,j=0; i >= 0; i--,++j)
                arrayReverse[j] =array[i];
 
            foreach (var i in arrayReverse)
            {
                Console.WriteLine(i);
            }
            Console.ReadKey(true);
1
shapod
85 / 83 / 10
Регистрация: 04.04.2011
Сообщений: 221
10.04.2011, 10:31 6
Решение с минимальным использованием памяти

C#
1
2
3
4
5
6
7
8
int[] array = { 1, 2, 3, 4, 5, 6, 7 };
int t;
for (int i = 0; i < (array.Length / 2); i ++)
{
   t = array[i];
   array[i] = array[array.Length - i];
   array[array.Length - i] = t;
}
При нечетном размере массива, средний элемент не будет вообще обработан.
0
Refactor
96 / 89 / 29
Регистрация: 05.03.2010
Сообщений: 231
10.04.2011, 13:27  [ТС] 7
Спасибо SSV за интересное решение, а у вас shapod при первой же итерации цикла - ексепшн
0
shapod
85 / 83 / 10
Регистрация: 04.04.2011
Сообщений: 221
10.04.2011, 13:29 8
Цитата Сообщение от Refactor Посмотреть сообщение
а у вас shapod при первой же итерации цикла - ексепшн
Писал в браузере

Что за ошибка?

Не по теме:

Ну, это если вам действительно нужно лучшее решение :), а не самое простое.

0
Refactor
96 / 89 / 29
Регистрация: 05.03.2010
Сообщений: 231
10.04.2011, 14:22  [ТС] 9
Цитата Сообщение от shapod Посмотреть сообщение
Что за ошибка?
Если я правильно понимаю то вы хотели написать чтото вроде

C#
1
2
3
4
5
6
7
8
9
          
            int[] array = { 1, 2, 3, 4, 5, 6, 7 };
            int t;
            for (int i = 0; i < ((array.Length-1) / 2); i++)
            {
                t = array[i];
                array[i] = array[array.Length-1 - i];
                array[array.Length-1 - i] = t;
            }
Да согласен, этот код работает, но... если добавить еще одну цифру до массива, то этот метод уже требует доработки, т.к. недопереставляются цифры на последней итерации цикла for
0
Killster
181 / 184 / 17
Регистрация: 26.11.2010
Сообщений: 511
10.04.2011, 14:29 10
Совсем модный вариант.
C#
1
2
3
4
5
6
7
            var mas = new[] {1, 2, 3, 4, 5, 6};
            for (int i = 0; i < (mas.Length / 2); i++)
            {
                mas[i] += mas[mas.Length - i - 1];
                mas[mas.Length - i - 1] = mas[i] - mas[mas.Length - i - 1];
                mas[i] -= mas[mas.Length - i - 1];
            }

P.S. С нечетными тоже работает.
P.P.S. Кто найдет пути для улучшения - в личку
2
zelen
10.04.2011, 18:31
  #11

Не по теме:

Killster, последний вариант просто издевательство какое то:)

0
Refactor
96 / 89 / 29
Регистрация: 05.03.2010
Сообщений: 231
10.04.2011, 20:12  [ТС] 12
Цитата Сообщение от Killster Посмотреть сообщение
Совсем модный вариант.
Спасибо Killster очень интересный вариант!
0
Koran
мастер топоров
884 / 709 / 101
Регистрация: 16.08.2009
Сообщений: 1,476
10.04.2011, 20:29 13
я вчитывался-вчитывался в условие и как понял надо написать код для реверса массива любой длины и любого содержания?
C#
1
2
3
4
5
6
7
8
            int[] foo = new int[] { 1, 2, 3, 4, 5, 6, 7 };
            int[] bar = new int[foo.Length];
            for (int i = 0; i < foo.Length; i++) {
                bar[i] = foo[foo.Length - i - 1];
            }
            foreach (int i in bar) {
                Console.Write("{0} ", i);
            }
1
Refactor
96 / 89 / 29
Регистрация: 05.03.2010
Сообщений: 231
10.04.2011, 20:48  [ТС] 14
Цитата Сообщение от Koran Посмотреть сообщение
я вчитывался-вчитывался в условие и как понял надо написать код для реверса массива любой длины и любого содержания?
Да, все правильно, спасибо за короткий пример.
0
Killster
181 / 184 / 17
Регистрация: 26.11.2010
Сообщений: 511
10.04.2011, 22:05 15
Цитата Сообщение от zelen Посмотреть сообщение

Не по теме:

Killster, последний вариант просто издевательство какое то:)

Не по теме:

Оптимизация, етить её! :)
Даже без дополнительной переменнной. Мой учитель по ассемблеру бы оценил

0
10.04.2011, 22:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.04.2011, 22:05

Лучший способ перебора
Не знал как назвать тему. В общем проблема в следующем. Есть 20-25 массивов по 10-30 элементами....

Лучший вариант локализации своего интерфейса
Есть задача изменять язык интерфейса программы. Сейчас делаю так: есть статический класс...

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru