Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.08.2016, 02:09   #1
komra2
Новичок
Джуниор
 
Регистрация: 10.04.2015
Сообщений: 733
По умолчанию сократить строки

Перебираются просто строки, значит, не о каких паролях речь не идет. Есть значит такой код:
Код:
static void Main(string[] args)
        {
            string str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
            for (int a = 0; a < str.Length; a++)
            {
                for (int b = 0; b < str.Length; b++)
                {
                    for (int c = 0; c < str.Length; c++)
                    {
                        string s1233 = str[a].ToString() + str[b].ToString() + str[c].ToString();
                        Console.WriteLine(s1233);
                        
                    }
                }
            }
            Console.ReadKey();
        }
Чтобы не писать много вот этих str[a].ToString()+str[b].ToString()+...str[x].ToString();
можно ли как-то сократить их кол-ство ?
И еще, чтобы не писать эти циклы, т.к. я могу там хоть 50 фор'ов прописать, а чтобы этого не делать, как сократить for'ы ?
komra2 вне форума Ответить с цитированием
Старый 22.08.2016, 05:49   #2
Fenex
Форумчанин
 
Аватар для Fenex
 
Регистрация: 15.02.2012
Сообщений: 821
По умолчанию

Если чего-то много повторяющегося и однотипного, то это обычно пытаются вынести в массив.
^-.-^ My GitHub
Fenex вне форума Ответить с цитированием
Старый 22.08.2016, 09:41   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

все ваши for по сути можно заменить на цикл-while+массив индексов.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.08.2016, 10:14   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

то, что Вы хотите, в математике (комбинаторике) называется
Размещения с повторениями

через вложенные for, в общем случае (когда длина k не задана строго) их обычно никто не реализует.
Вариантов реализации может быть много. Тот способ, что предложил Пепел Феникса в #3, достаточно простой, наглядный и эффективный, вполне можно его использовать.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.08.2016, 13:57   #5
komra2
Новичок
Джуниор
 
Регистрация: 10.04.2015
Сообщений: 733
По умолчанию

все ваши for по сути можно заменить на цикл-while+массив индексов.
цикл вайл знаю как записать , а вот массив пока нет.
komra2 вне форума Ответить с цитированием
Старый 22.08.2016, 14:14   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
        private static IEnumerable<string> CustomGenerator(int length, string chars)
        {
            int[] indexes = new int[length];
            while (indexes[0] < chars.Length)
            {
                string str = string.Join("", indexes.Select(ind => chars[ind]));
                yield return str;
                indexes[indexes.Length - 1]++;
                for (int i = indexes.Length - 1; i > 0; i--)
                {
                    if (indexes[i] < chars.Length)
                        continue;
                    indexes[i] = 0;
                    indexes[i - 1]++;
                }
            }
        }
знаешь, на.
кусок моей проги.
но, объяснять я его не буду.
ибо я вам много раз говорил, учите основы.
применяется оно так:
Код:
foreach(string str in CustomGenerator(10,"abc"))
{
  Console.WriteLine(str);
}
PS: правда в моей программе она чуть удобнее в применении(она не вызывается напрямую).
у меня можно так:
Код:
CustomGenerator(10,"a-z".Expand())
и это тоже самое что и
Код:
CustomGenerator(10,"abcdefghijklmnopqrstuvwxyz")
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 22.08.2016 в 14:23.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.08.2016, 14:20   #7
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

Цитата:
for (int i = 0; i < indexes.Length; i++)
indexes[i] = 0;
это лишнее
come-on вне форума Ответить с цитированием
Старый 22.08.2016, 14:22   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

да я заметил, убирать не стал.
default(int) == 0 итак.

поправил.

тут в идеале бы и проверку входных данных добавить.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 26.08.2016, 10:57   #9
kva52
 
Регистрация: 23.06.2014
Сообщений: 5
По умолчанию

Для лучшего понимания новичкам переписал код:
Код:
    private static IEnumerable<string> CustomGenerator(int length, string chars)
    {
      int[] indexes = new int[length];
      while (indexes[0] < chars.Length)
      {
        string str = "";
        for (int i = 0; i < length; i++)
          str += chars[indexes[i]];
        yield return str;

        //корректируем indexes для следующих вызовов CustomGenerator
        indexes[length - 1]++;
        for (int i = length - 1; i > 0; i--)
        {
          if (indexes[i] < chars.Length)
            continue;
          indexes[i] = 0;
          indexes[i - 1]++;
        }
      }
    }
Здесь расписал Join и заменил indexes.Length на length

Спасибо Пеплу Феникса за первоначальный код. Мне он показался интересным.

Последний раз редактировалось kva52; 26.08.2016 в 11:00.
kva52 вне форума Ответить с цитированием
Старый 26.08.2016, 12:38   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

хорошо
думаю будет полезно.

однако замечу, что код стал чаще выделять память.
ибо string += всегда создает новую строку, в то время как string.Join внутри использует StringBuilder.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сократить код kostan3 Visual C++ 0 15.03.2013 14:08
сократить код Kirja23 Microsoft Office Excel 1 20.02.2013 22:34
сократить код kostan3 Паскаль, Turbo Pascal, PascalABC.NET 2 17.02.2013 17:24
Сократить Формулу Adrenalin_N Microsoft Office Excel 2 03.07.2011 17:28
Сократить код shapiro Помощь студентам 0 14.04.2010 17:38