Метод расширения для возврата случайного алфавита - PullRequest
1 голос
/ 02 декабря 2009

Как разработать метод расширения, который может возвращать случайный символ (один символ) из алфавита (a, b, .... z).

public static char RandomLetter(this char randomchar)
{

}

Ответы [ 4 ]

8 голосов
/ 02 декабря 2009

Метод расширения здесь не тот инструмент, поскольку случайная буква из алфавита не связана с вводимой буквой (или я что-то здесь упускаю?).

static string alphabet = "QWERTYUIOPASDFGHJKLZXCVBNM";
static Random = new Random();

public static char RandomLetter()
{
    return alphabet[random.Next(alphabet.Length)];
}

Редактировать (отвечая на комментарии):

Вы можете сделать это методом расширения для типа Random:

public static char NextRandomLetter(this Random random)
{
    return alphabet[random.Next(alphabet.Length)];
}

(я решил не называть это NextLetterOfTheAlphabet, поскольку оно, очевидно, должно быть случайным)

Потоковая безопасность может быть добавлена ​​путем синхронизации с закрытой переменной класса, который реализует этот метод. Однако я думаю, что весь процесс блокировки требует больше ресурсов процессора, чем выбор случайного числа:

public static char SynchronizedRandomLetter()
{
    lock (random) // Although the lock is not random ;)
    {
        return alphabet[random.Next(alphabet.Length)];
    }
}
1 голос
/ 02 декабря 2009

Не имеет смысла делать это методом расширения char, так как вы не используете char в качестве входных данных. Вы бы предпочли сделать это просто статическим методом.

Вы можете создать метод расширения для строки, который выбирает один из символов в строке:

public static Extensions {

  public static char PickOneChar(this string chars, Random rnd) {
    return chars[rnd.Next(chars.Length)];
  }

  public static char PickOneChar(this string chars) {
    return chars.PickOneChar(new Random())
  }

}

(Обратите внимание на перегрузку, которая принимает случайный объект; если вы делаете это неоднократно, вы должны создать один случайный объект и передать его в метод. Создание нескольких случайных объектов близко во времени дает вам одну и ту же случайную последовательность снова и снова.)

Пример:

char[] pass = new char[8];
Random rnd = new Random();
for (int i = 0; i < pass.Length; i++) {
  pass[i] = "23456789BCDEFGHJKLMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz".PickOneChar(rnd)
}
string password = new String(pass);
1 голос
/ 02 декабря 2009

вы можете использовать преобразование байтового кода в символ и использовать простое:

random.Next (0,27), чтобы дать вам следующий случайный символ (суммируйте его с байтовым значением a & convert to char).

0 голосов
/ 02 декабря 2009
String[] letters = {"a",.....,"z"};
Random rand = new Random();
String letter = letters[rand.Next(0,letters.Length-1)];

должен сделать работу.

...