Не удается неявно преобразовать тип "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 шт):
Вот простая реализация. Инициализировать константы только один раз как константы или переменные класса. Отделяйте служебные функции от 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);
}
Вот более правильный код, напишите, если будут проблемы
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;
}
}
Пусть у вас будет список строк, каждая из которых представляет определенный диапазон. Создайте консольное приложение, чтобы проверить, как работает код, который я покажу, и только потом переносите его в свой проект.
Но для начала, создадим метод, который генерирует строчку, от нужного символа нужной длины. Всегда разбивайте свои задачи на методы, так будет проще работать с кодом.
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));
}
