С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
6 / 3 / 3
Регистрация: 17.10.2022
Сообщений: 54

Цикл для создания содержимого списка

01.01.2023, 17:53. Показов 1002. Ответов 16

Студворк — интернет-сервис помощи студентам
Мне нужно сделать список (ключ, значение) большого объёма и проще всего сделать это через цикл. Но как сделать уникальные ключи, из алфавита символов (A-Z, 0-9, a-z, А-Я, а-я), причём заглавные и строчные буквы как два разных знака. Ключ должен состоять из 6 символов. Всего нужно сделать ключей для 16'777'216 значений в списке
Пример: A, aA, A4A, 9B777 и т.д.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.01.2023, 17:53
Ответы с готовыми решениями:

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

Программа создания списка из гласных букв файла и печать содержимого файла
Дан буквенный файл (в котором содержится какой-либо текст). Составить программу создания списка из гласных букв файла и печати содержимого...

Дано литературный файл составить программу создания списка гласных букв в файл и печати содержимого файла С ++
Дано литературный файл составить программу создания списка гласных букв в файл и печати содержимого файла С ++ Я сделала поиск гласных...

16
419 / 311 / 107
Регистрация: 30.08.2022
Сообщений: 1,195
01.01.2023, 18:09
000001
000002
...
Чем не уникальны?

Добавлено через 3 минуты
Цитата Сообщение от MrSpy Посмотреть сообщение
Всего нужно сделать ключей для 16'777'216
Вы хоть понимаете что поставленная задача ну +- это и есть столько значений. Для критикиов да, я знаю что меньше. Те единственный путь у вас перебор
0
6 / 3 / 3
Регистрация: 17.10.2022
Сообщений: 54
01.01.2023, 18:44  [ТС]
brian778, если брать только цифры то максимум значений выйдет 999999 а мне нужно на 16777216, поэтому нужно брать другие символы.

Добавлено через 52 секунды
и уложится в 6 символов для ключа
0
419 / 311 / 107
Регистрация: 30.08.2022
Сообщений: 1,195
01.01.2023, 18:54
https://www.geeksforgeeks.org/... -string-2/

Добавлено через 2 минуты
Но тут задача немного другая, не обязательно 6. Будет желание доработаете
0
15 / 10 / 5
Регистрация: 05.01.2015
Сообщений: 26
01.01.2023, 22:25
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
using System;
using System.Collections.Generic;
 
namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            const int keyLength = 6;
            const int numberOfKeys = 16777216;
 
            var keys = new List<string>();
            for (int i = 0; i < numberOfKeys; i++)
            {
                var key = "";
                for (int j = 0; j < keyLength; j++)
                {
                    int letterIndex = i % 52;
                    if (letterIndex < 26)
                    {
                        key += (char)(letterIndex + 'A');
                    }
                    else
                    {
                        key += (char)(letterIndex - 26 + 'a');
                    }
                    i /= 52;
                }
                keys.Add(key);
            }
            Console.WriteLine(string.Join(", ", keys));
        }
    }
}

Этот код создаст список keys из 16777216 уникальных строк, каждая из которых состоит из 6 символов. Каждый символ будет одной из следующих букв: A-Z, a-z. Заглавные и строчные буквы рассматриваются как разные символы.
0
6 / 3 / 3
Регистрация: 17.10.2022
Сообщений: 54
01.01.2023, 22:40  [ТС]
lexisas, Спасибо большое, но у меня код не заработал. С начала ел много оперативки, но не суть, в итоге выдал это на 22 строке: System.OutOfMemoryException: "Выдано исключение типа "System.OutOfMemoryException"." В консоли так ничего не вышло.
0
15 / 10 / 5
Регистрация: 05.01.2015
Сообщений: 26
01.01.2023, 22:43
ну, да, затратная штука по памяти.
0
6 / 3 / 3
Регистрация: 17.10.2022
Сообщений: 54
01.01.2023, 23:02  [ТС]
lexisas, уменьшил длину ключа до 1, всё равно не работает, та же ошибка

Добавлено через 2 минуты
в свойствах программы значение ключей улетает за 134 миллиона, надо что то подкрутить ещё
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16118 / 11240 / 2887
Регистрация: 21.04.2018
Сообщений: 33,044
Записей в блоге: 2
02.01.2023, 14:44
Цитата Сообщение от MrSpy Посмотреть сообщение
Но как сделать уникальные ключи, из алфавита символов
Должны ли ключи быть случайными? Или можно возвращать их в лексикографическом порядке?

Добавлено через 2 минуты
Цитата Сообщение от MrSpy Посмотреть сообщение
Пример: A, aA, A4A, 9B777 и т.д.
Длина ключа любая до заданной величины? Или все ключи одинаковой длины?
0
 Аватар для roach1967
983 / 463 / 233
Регистрация: 27.06.2014
Сообщений: 1,033
02.01.2023, 15:05
MrSpy, 16777216 - это три байта или шесть шестнадцатеричных числа.
Т.е. нужно всего лишь сгенерировать числа от 0x000000 до 0xFFFFFF.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16118 / 11240 / 2887
Регистрация: 21.04.2018
Сообщений: 33,044
Записей в блоге: 2
02.01.2023, 16:10
MrSpy, метод расширения возвращающий случайные ключи заданной длины:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
namespace Core2022.Topics;
 
public static class MrSpy
{
    private static readonly Random random = new Random();
    public static IEnumerable<T[]> RandomKey<T>(this IEnumerable<T> set, int keyLength)
    {
        T[] result = new T[keyLength];
        T[] array = set.ToArray();
        while (true)
        {
            for (int i = 0; i < keyLength; i++)
            {
                result[i] = array[random.Next(array.Length)];
            }
            yield return result;
        }
    }
}
Его использование для получения множества ключей:
C#
1
2
3
4
5
6
7
8
9
10
11
12
{
    int count = 16_777; // 16_777_216; Меньшее значение для более быстрого теста.
    HashSet<string> keys = new HashSet<string>(count); // Множество создаваемых уникальных ключей.
 
    // Цикл получения случайных ключей и добавления их в множество.
    foreach (var chars in "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя0123456789".RandomKey(6))
    {
        keys.Add(new string(chars));
        if (keys.Count >= count)
            break;
    }
}
0
419 / 311 / 107
Регистрация: 30.08.2022
Сообщений: 1,195
02.01.2023, 16:47
Элд Хасп, при всём уважении, но этот код может надолго затянуться, когда количество нужных уникальных элементов приближено к их возможному числу

Добавлено через 11 минут
Хотя это я уже туплю. Речь про уникальность тут впринципе не идёт
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16118 / 11240 / 2887
Регистрация: 21.04.2018
Сообщений: 33,044
Записей в блоге: 2
02.01.2023, 17:17
Цитата Сообщение от brian778 Посмотреть сообщение
но этот код может надолго затянуться, когда количество нужных уникальных элементов приближено к их возможному числу
Да.
Но в данном случае возможных вариантов 242, а ключей нужно получить 224.
Вероятность коллизии 2-18. Можно ею пренебречь.

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

Добавлено через 1 минуту
Цитата Сообщение от brian778 Посмотреть сообщение
Речь про уникальность тут впринципе не идёт
Уникальность обеспечивается не в самом методе, а накоплением в HashSet значений возвращаемых им.

Добавлено через 6 минут
Для теста проверил количество коллизий и время выполнения:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
    int count =  16_777_216;
    int collisions = 0; 
    Stopwatch stopwatch= Stopwatch.StartNew();
    HashSet<string> keys = new HashSet<string>(count); // Множество создаваемых уникальных ключей.
 
    stopwatch.Start();
    // Цикл получения случайных ключей и добавления их в множество.
    foreach (var chars in "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя0123456789".RandomKey(6))
    {
        if (!keys.Add(new string(chars)))
            collisions++;
        if (keys.Count >= count)
            break;
    }
    stopwatch.Stop();
    WriteLine(stopwatch.Elapsed);
    WriteLine(collisions);
}
Консоль00:00:05.2705126
33


Добавлено через 4 минуты
Очень близко к теоретическому среднему значению 0.5 * 224 * 2-18 = 25.
0
26 / 14 / 12
Регистрация: 01.02.2019
Сообщений: 66
02.01.2023, 23:20
MrSpy, а вам принципиально, что бы ключ был читаемой строкой из букв алфавитов и цифр?
Если нет, то, как roach1967 выше сказал, мне такое решение больше нравится:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
                    
public class Program
{
    public static void Main()
    {
        //for (int i=0; i < 256*256*256; i++) // 256 * 256 * 256  = 16'777'216 
        for (int i=250; i < 300; i++)
            writeNewKey(i);
    }
    
    public static void writeNewKey(int key){
        char c1=(char)((key >> 16) & 0xFF);
        char c2=(char)((key >> 8) & 0xFF);
        char c3=(char)((key >> 0) & 0xFF);
        /*Console.Write($"key binary: {Convert.ToString(key, toBase: 2).PadLeft(32, '0'), 32}");
        Console.Write($":{Convert.ToString(c1, toBase: 2).PadLeft(8, '0'), 8}");
        Console.Write($"|{Convert.ToString(c2, toBase: 2).PadLeft(8, '0'), 8}");
        Console.WriteLine($"|{Convert.ToString(c3, toBase: 2).PadLeft(8, '0'), 8}");*/
        Console.WriteLine(new String(new char[]{c1,c2,c3}));
    }
}
Добавлено через 42 минуты
Или то что вы хотели.
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
using System;
using System.Text;
                    
public class Program
{
    public static char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя0123456789".ToCharArray();
    public static void Main()
    {
        
        //for (int i=0; i < 128*128*128*128; i++)  // alphabet.Length = 128;  128*128*128*128 =  268'435'456  > 16'777'216, достаточно 4 символов, потому первые два всегда 'A'
        //for (int i=0; i < 16777216; i++)  
        for (int i=0; i < 1000; i++)
            writeNewKey(i);
        /*Console.WriteLine(alphabet.Length);
        Console.WriteLine(128*128*128*128);*/
    }
    
    public static void writeNewKey(int key){
        StringBuilder sb= new StringBuilder();
        byte c1=(byte)((key >> 21) & 0x7F);
        byte c2=(byte)((key >> 14) & 0x7F);
        byte c3=(byte)((key >> 7) & 0x7F);
        byte c4=(byte)((key >> 0) & 0x7F);
 
        sb.Append('A').Append('A').Append(alphabet[c1]).Append(alphabet[c2]).Append(alphabet[c3]).Append(alphabet[c4]);
        Console.WriteLine(sb.ToString() + " "+ key);
    }
}
0
6 / 3 / 3
Регистрация: 17.10.2022
Сообщений: 54
03.01.2023, 01:48  [ТС]
cyberforu99999m, Мне интересно где вы все учились? Спасибо, это то что мне нужно
0
26 / 14 / 12
Регистрация: 01.02.2019
Сообщений: 66
03.01.2023, 04:37
MrSpy, курсы "начинающий программист C#" на скилфактори. Шучу, конечно. Нет, никто тут не обучался в IT Хогвартсе по учебнику Торвальдса-полукровки, в котором есть ответы на все вопросы. Ведь никто же? (Тс-с-с-с, не говорите ему, статут и всё такое).
Просто знайте свои инструменты и умейте применять. Учитесь разбивать задачу на подзадачи. Посещайте этот форум, смотрите чужие задачи и их решения.
Честно сказать, я не стал бы решать вашу задачу, но скажем спасибо Элд Хасп, который не поленился напечатать все возможные символы, предоставив char array. "Надо перебрать массив? Пф-ф-ф, подержи моё пиво." Мне просто захотелось освежить битовые операции. А вы, если знаете оператор for, должны были написать что-нибудь такое
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
using System;
using System.Text;
 
public class Program
{
    public static readonly char[] alphabet = "qwe".ToCharArray();
    public static void Main()
    {
        doSomeStuff();
        // continue to do other stuff
    }
    
    public static void doSomeStuff(){
        int counter = 0;
        int targetCounter = 16777;
        bool isEnough = false;
        StringBuilder sb = new StringBuilder(6);
        for (int i=0; i < alphabet.Length; i++)
            for (int j=0; j < alphabet.Length; j++)
                for (int k=0; k < alphabet.Length; k++)
                    for (int l=0; l < alphabet.Length; l++)
                        for (int m=0; m < alphabet.Length; m++)
                            for (int n=0; n < alphabet.Length; n++){
                                sb.Append(alphabet[i]).Append(alphabet[j]).Append(alphabet[k]).Append(alphabet[l]).Append(alphabet[m]).Append(alphabet[n]);
                                writeStuff(sb);
                                counter += 1;
                                // do some stuff, set isEnough = true
                                if (counter >= targetCounter || isEnough) return;
                                sb.Clear();
                            }
    }
    public static void writeStuff(StringBuilder a){
        Console.WriteLine(a.ToString());
    }   
}
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16118 / 11240 / 2887
Регистрация: 21.04.2018
Сообщений: 33,044
Записей в блоге: 2
03.01.2023, 08:25
Цитата Сообщение от cyberforu99999m Посмотреть сообщение
но скажем спасибо Элд Хасп, который не поленился напечатать все возможные символы
Всё гораздо проще.
Надо только ввести правильный поиск.

Русский и английский алфавит в одну строку
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.01.2023, 08:25
Помогаю со студенческими работами здесь

Примените рекурсию для создания списка, содержащего элементы списка L в заданном интервале
Примените рекурсию для создания списка, содержащего только те элементы списка L, которые имеют значение больше 1 и меньше 100.

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

Цикл для создания 2.5D карты
Пытаюсь разобраться в создании изометрической карты. У меня получилось склеить спрайты в виде ромба,но нет идей для того,чтобы корректно...

Цикл для создания Series в Builder C++
Здравствуйте! Подскажите, пожалуйста, как можно создать цикл, чтобы создавалось некоторое количество Series на графике. Вот кусочек: ...

Цикл запросов для создания стат-отчетов
Уважаемые форумчане, подскажите как написать цикл в прилагаемом примере. Есть много запросов, объединенных в модуле, модуль...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru