C#随机方法导致"隐藏破折号"

use*_*712 4 c# string random

我正在尝试使用以下方法生成一个包含8个字符的随机字符串,并且它工作正常,但这是一个小问题.

当我将字符串打印到屏幕并将其从IE复制到记事本时,有时会在字符串中间添加短划线( - ).是什么导致这种情况,我该如何解决?

它不会发生很多,可能是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;
    }
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 8

您显示的代码不会对字符串添加任何奇怪的内容.也许这就是你复制和粘贴导致问题的方式.如果它偶尔会导致问题,请查看HTML源代码(右键单击,查看源代码),看看是否可以在那里看到问题.

编辑:正如Henk发现的那样,你的代码显然不是全部.你是如何最终得到源代码中的奇怪角色的?


话虽如此,我肯定会改变你的代码:

  • 我将这个名称命名为.NET命名约定
  • 我将其Random作为参数,因此您可以快速连续多次调用它,而不会多次生成相同的字符串
  • 我创建一个正确长度的char数组,填充它,然后从中创建一个新的字符串,而不是使用字符串连接
  • 我会生成字符串的长度,甚至可能是字符集参数.

只是想知道它会是什么样子 - 在这个例子中我没有将字符集转换为参数,但是我从方法中提取了它:

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);
}
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用设置的初始大小而不是使用字符数组来分配字符串缓冲区.它会更容易使用,但我不太确定性能差异(并且没有方便的反射器副本来检查) (2认同)

Hen*_*man 6

稍微戳了一下后,下面的一行不是它看起来的样子.在字母H和J之间还有另一个字符#173或者&shy;,它不会在FireFox或Chrome中显示.但IE用户可以在这里看到它:

 string chars = "abcdefghijkmnopqrstuvwxyzABCDEFGH­JKLMNOPQRSTUVWXYZ123456789";
Run Code Online (Sandbox Code Playgroud)

因此,要快速解决它只需重新键入HJK部分chars.