Не удается неявно преобразовать тип "char" в "string"

Программа генератора паролей. Есть возможность выбора - дополнить пароль символами. Я создал переменую которая записывает в себя данные с textBox2.Text и потом в цикле выполняется генерация. Но возникает ошибка Ошибка CS0029 Не удается неявно преобразовать тип "char" в "string"..

Я пробовал конвертацию в char входных данных в переменую, но не помогло. Подскажите как сделать правильно.

Ещё я хочу замиксовать оба результата (что бы они смешивались и пароль на выходе получался более надежным), подскажите как это реализовать.

Код:

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string data = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";
            char symbols = Convert.ToChar(textBox2.Text);
            int lon = (int)numericUpDown1.Value;
            string result = "";
            string result_symbols = "";
            Random rnd = new Random();
            int lng = data.Length;
            int lng2 = data.Length;



            for (int i = 0; i < lon; i++)
            {
                result_symbols = Convert.ToChar(symbols[rnd.Next(lng)]);
                result += data[rnd.Next(lng)];
            }

            textBox1.Text = result;
        }
    }

Скриншот программы:

введите сюда описание изображения


Ответы (3 шт):

Автор решения: pasx

Вот простая реализация. Инициализировать константы только один раз как константы или переменные класса. Отделяйте служебные функции от UI кода.

    private const string Letters = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";
    private const string Symbols = "~...";
    private readonly char[] _lettersAndSymbols = (Letters + Symbols).ToCharArray();
    private readonly int _lettersAndSymbolsLength = (Letters + Symbols).Length;
    private readonly Random _rnd = new Random();

    public Form1()
    {
        InitializeComponent();
        textBox2.Text = Symbols ;
    }

    private string GeneratePassword(int length)
    {
        var result = string.Empty;
        for (var i = 0; i < length; i++)
        {
            result += _lettersAndSymbols[_rnd.Next(_lettersAndSymbolsLength)];
        }

        return result;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        var lon = (int)numericUpDown1.Value;
        textBox1.Text = GeneratePassword(lon);
    }
→ Ссылка
Автор решения: Yotic

Вот более правильный код, напишите, если будут проблемы

 public partial class Form1 : Form
    {
        string standard = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            List<char> symbols = textBox2.Text.ToList();
            string result = "";
            Random rnd = new Random();
            for (int i = 0; i < (int)numericUpDown1.Value; i++)
                result += symbols[rnd.Next(0, symbols.Count)].ToString();
            textBox1.Text = result;
        }
    }
→ Ссылка
Автор решения: aepot

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

Но для начала, создадим метод, который генерирует строчку, от нужного символа нужной длины. Всегда разбивайте свои задачи на методы, так будет проще работать с кодом.

private string GetRangeString(char first, int length)
{
    return string.Concat(Enumerable.Range(first, length).Select(c => (char)c));
}

Чтобы понять, как можно таким образом составлять диапазоны символов - посмотрите в таблицу символов ASCII, и сразу станет понятно, что английские буквы и цифры идут по порядку. С русскими сложнее, там не все по порядку, но они вам вроде и не нужны. Для русских в C# используется кодировка UTF-16 (Unicode).

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

List<string> list = new List<string>();
list.Add(GetRangeString('A', 26)); // ABCDEFGHIJKLMNOPQRSTUVWXYZ
list.Add(GetRangeString('a', 26)); // abcdefghijklmnopqrstuvwxyz
list.Add(GetRangeString('0', 10)); // 0123456789
list.Add("=/.;!?");                // =/.;!?

Как видите в список можно просто добавлять строки с любым содержимым. Список предлагаю для того, чтобы вы галочками и настройками в интерфейсе могли регулировать наполнение словаря просто добавив несколько if в код.

Теперь надо составить из этого строку из уникальных символов.

string dictionary = string.Concat(string.Concat(list).Distinct());
Console.WriteLine(dictionary);

(для опытных: да, здесь хорошо подойдет так же Linq SelectMany)

Готово, вывод в консоль

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789=/.;!?

Distinct() как раз и удаляет из строки повторяющиеся символы.

Теперь сделать используя этот словарь пароль нужной длины

int length = 8;
Random rnd = new Random();

string password = string.Concat(Enumerable.Repeat(0, length).Select(_ => dictionary[rnd.Next(dictionary.Length)]));

Console.WriteLine(password);

Вот и все решение. Я конечно обильно использовал Linq, но это же самое можно сделать на простых циклах, типа как у вас. Смысл этого ответа как раз в том, чтобы показать, как самому составить словарь символов из нескольких наборов.

Кстати, чтобы пробежаться по строке циклом, не нужно преобразовывать ее в массив символов, потому что строка это и есть массив символов, и можно к этим символам так же обращаться по индексу, как в обычном символьном массиве. Единственно отличие - вы не сможете перезаписывать символы в строке, а только читать.

Вывод в консоль

LS4gAZ.J

Весь код, чтобы поиграться

static void Main(string[] args)
{
    List<string> list = new List<string>();
    list.Add(GetRangeString('A', 26));
    list.Add(GetRangeString('a', 26));
    list.Add(GetRangeString('0', 10));
    list.Add("=/.;!?");

    string dictionary = string.Concat(string.Concat(list).Distinct());
    Console.WriteLine(dictionary);

    int length = 8;
    string password = GeneratePassword(dictionary, length);
    Console.WriteLine(password);
}

private static string GeneratePassword(string dictionary, int length)
{
    Random rnd = new Random();
    return string.Concat(Enumerable.Repeat(0, length).Select(_ => dictionary[rnd.Next(dictionary.Length)]));
}

private static string GetRangeString(char first, int length)
{
    return string.Concat(Enumerable.Range(first, length).Select(c => (char)c));
}
→ Ссылка