Случайный метод C # вызывает «скрытый тире» - PullRequest
4 голосов
/ 22 мая 2011

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

Когда я печатаю строку на экране и копирую ее изТо есть в Блокнот, иногда в середине строки добавляется тире (-).Что вызывает это и как я могу это исправить?

Этого не происходит много, может быть 1/10 раз, но все же, это портит строку.

    public string generateString()
    {
        int length = 8;
        string str = "";

        string chars = "abcdefghijkmnopqrstuvwxyzABCDEFGH­JKLMNOPQRSTUVWXYZ123456789";

        int charsCount = chars.Length;
        Random random = new Random();
        for (int i = 0; i < length; i++)
        {
            str += chars[random.Next(0, charsCount)];
        }

        return str;
    }

Ответы [ 2 ]

8 голосов
/ 22 мая 2011

Код, который вы показали, не добавит ничего странного в строку. Возможно, именно способ копирования и вставки создает проблему. Если это иногда вызывает проблему, посмотрите на источник HTML (щелкните правой кнопкой мыши, Просмотреть источник) и посмотрите, видите ли вы там проблему.

РЕДАКТИРОВАТЬ: Как Хенк узнал, ваш код, очевидно, не все, что кажется. Как вы получили странный символ в исходном коде для начала?


Сказав это, я определенно хотел бы изменить ваш код:

  • Я бы сделал так, чтобы имя соответствовало соглашениям об именах .NET
  • Я бы взял Random в качестве параметра, чтобы вы могли вызывать его несколько раз подряд, не генерируя одну и ту же строку несколько раз
  • Я бы создал массив символов правильной длины, заполнил его, а затем создал бы новую строку из нее вместо использования конкатенации строк
  • Я бы сделал длину строки для генерации и, возможно, даже параметры набора символов.

Просто чтобы дать некоторое представление о том, как это будет выглядеть - в этом примере я не не превратил набор символов в параметр, но я извлек его из метода:

private const string ValidCharacters =
    "abcdefghijkmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789";

public static string GenerateString(Random random, int length)
{
    // TODO: Argument validation
    char[] chars = new char[length];
    for (int i = 0; i < chars.Length; i++)
    {
        chars[i] = ValidCharacters[random.Next(ValidCharacters.Length)];
    }
    return new string(chars);
}
6 голосов
/ 22 мая 2011

После небольшого возни, следующая строка - не то, что кажется.Между буквами H и J есть еще один символ # 173 или &shy;, который не отображается в FireFox или Chrome.Но пользователи IE могут увидеть его здесь:

 string chars = "abcdefghijkmnopqrstuvwxyzABCDEFGH­JKLMNOPQRSTUVWXYZ123456789";

Итак, чтобы быстро решить эту проблему, просто наберите HJK часть chars.

...