单词中的随机大写+多个字符串插入

时间:2015-03-05 21:42:46

标签: c# winforms visual-studio visual-studio-2012

我真的需要一个下一个场景的解决方案(我一直在寻找几个小时并在寻找一个平稳的解决方案,但没有一个工作):

我有一个winform:

  • 解析文本文件
  • 使用该文件中的随机单词生成一些文件夹

到目前为止我的代码:

int value;
string path = null;

private void button1_Click(object sender, EventArgs e)
{
    FolderBrowserDialog fbd = new FolderBrowserDialog();
    if (fbd.ShowDialog(this) == DialogResult.OK)
    {
        path = fbd.SelectedPath;

    }
}

private void textBox1_TextChanged(object sender, EventArgs e)
{
    value = Convert.ToInt32(textBox1.Text);//store the value from the textbox in variable "value"
}

private void button2_Click(object sender, EventArgs e)
{

    if (path != null && Directory.Exists(path))
        for (int i = 0; i < value; i++)
        {
            Random rnd = new Random();
            string tick1 = rnd.Next(0, 10).ToString();

            var lines = File.ReadAllLines(@"M:\\dictionar.txt");
            var r = new Random(DateTime.Now.Millisecond);
            var randomLineNumber = r.Next(0, lines.Length - 1);
            var line = lines[randomLineNumber];

            StringBuilder b = new StringBuilder();
            for (int j = 0; j < line.Length; j++)
            {
                char c = line[j];
                if (rnd.Next(2) == 0)
                {
                    c = Char.ToUpper(c);
                }
                b.Append(c);
                if (j % 3 == 2)
                {
                    b.Append(rnd.Next(10));
                }
            }
            line = b.ToString();

            Directory.CreateDirectory(Path.Combine(path, string.Format("{0}", line.Insert(2, tick1).Insert(4, tick1).Insert(6, tick1))));
        }
}

有没有办法将ToUpper()方法用作line.Insert()方法,以便我可以获得随机的大写字母?更多,有没有更好的方法来随机化这些索引位置line.Insert()(我问这个是因为当它生成文件夹名称时:索引是相同的:例如pe8rs8on8al,之后索引会发生变化。)? 我想实现以下目标:

如果我在.txt文件中有下一个单词:

个人
足球
编程
电脑

我希望文件夹名称如下所示:

Pe3rs9oN1al
fO8ot5Ba6lL

4 个答案:

答案 0 :(得分:1)

您可以遍历字符串中的字符并根据随机值构建新字符串:

StringBuilder b = new StringBuilder();
for (int i = 0; i < line.Length; i++ ) {
  char c = line[i];
  if (rnd.Next(2) == 0) {
    c = Char.ToUpper(c);
  }
  b.Append(c);
  if (i % 2 == 1) {
    b.Append(rnd.Next(10));
  }
}
line = b.ToString();

注意:您不应该在循环中创建Random个对象。您应该在循环之前创建一个Random对象,并用于您需要的所有随机数。及时创建实例会使它们返回相同的随机数序列。此外,您不需要从时钟中播种随机生成器,没有参数的构造函数会自动执行此操作:

Random rnd = new Random();

所以,方法中的代码是:

if (path != null && Directory.Exists(path))
    Random rnd = new Random();
    for (int i = 0; i < value; i++)
    {
        var lines = File.ReadAllLines(@"M:\\dictionar.txt");
        var randomLineNumber = rnd.Next(0, lines.Length);
        var line = lines[randomLineNumber];

        StringBuilder b = new StringBuilder();
        for (int j = 0; j < line.Length; j++)
        {
            char c = line[j];
            if (rnd.Next(2) == 0)
            {
                c = Char.ToUpper(c);
            }
            b.Append(c);
            if (j % 2 == 1)
            {
                b.Append(rnd.Next(10));
            }
        }
        line = b.ToString();

        Directory.CreateDirectory(Path.Combine(path, line));
    }
}

请注意rnd.Next(0, lines.Length)选择随机行。随机数的上限不包括在内,因此如果您使用rnd.Next(0, lines.Length - 1),它将永远不会选择最后一行。

答案 1 :(得分:0)

那是因为你在同一个循环中只指定了tick1。如果您想更改此设置,请在代码中添加其他刻度,如下所示:

string tick1 = rnd.Next(0, 10).ToString();
string tick2 = rnd.Next(0, 10).ToString();
string tick3 = rnd.Next(0, 10).ToString();

然后在格式化字符串中使用它们:

 Directory.CreateDirectory(Path.Combine(path, string.Format("{0}", line.Insert(2, tick1).Insert(4, tick2).Insert(6, tick3))))

答案 2 :(得分:0)

喜欢这个

enter image description here

public Form1()
    {
        InitializeComponent();
        string content = "";
        using (FileStream fs = new FileStream("D:\\names.txt", FileMode.Open, FileAccess.Read)) 
            using (StreamReader sr = new StreamReader(fs))
            content = sr.ReadToEnd();
        string[] names = content.Split(new string[] { "\r\n", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries);

        string path = "D:\\RandDirs";
        if (!Directory.Exists(path))Directory.CreateDirectory(path) ;

        for (int i = 0; i < 50; i++) Directory.CreateDirectory(path + "\\" + getRandomName(names));
    }

    Random randName = new Random();
    Random insertingNumber = new Random();
    Random randUpper = new Random();
    Random randInsertNumber = new Random();
    string getRandomName(string[] names)
    {
        string name = names[randName.Next(names.Length)];
        name = name.Replace(" ", "");
        string result = "";

        for (int i = 0; i < name.Length; i++)
            result += (randUpper.Next(0, 9) <= 5 ? name[i].ToString().ToLower() : name[i].ToString().ToUpper())
            + (((i + 1) % 2 == 0) ? insertingNumber.Next(0, 9).ToString() : "");
        return result;
    }

根据您的需要,我已经从随机插入数字改为每2个字符插入数字。

答案 3 :(得分:0)

就像Guffa说你不应该在循环中使用Random,在所有偏好中你只应该实例化其中一个,但我认为你可以像这样使用它

public static class StringRandomize
{
    static readonly Random rnd = new Random();
    static char[] permmitedCharacters { get; set; }

    static StringRandomize()
    {
        List<char> Chars=  new List<char>();
        for (int i = 48; i < 48+10; i++)
        {
            Chars.Add((char)i);
        }
        for (int i = 65; i < 65+26; i++)
        {
            Chars.Add((char)i);
        }
        permmitedCharacters = Chars.ToArray();
    }

    public static string Randomize(string input, double RandomizePercent = 30)
    {
        StringBuilder result = new StringBuilder();
        int index = 0;
        while (index < input.Length)
        {

            if (rnd.Next(0, 100) <= RandomizePercent)
            {
                if (rnd.Next(0, 100) <= RandomizePercent)
                {
                    result.Append(GenerateCaracter());
                }
                else
                {
                    if (rnd.Next(0, 100) > 50)
                    {
                        result.Append(input.ToLower()[index]);
                    }
                    else
                    {
                        result.Append(input.ToUpper()[index]);
                    }
                    index++;
                }
            }
            else
            {
                result.Append(input[index]);
                index++;
            }
        }
        return result.ToString();
    }

    private static char GenerateCaracter()
    {
        return permmitedCharacters[rnd.Next(0, permmitedCharacters.Length)];
    }
}


    private static void GenerateRandomDirectories(string path, int value)
    {
        //I'm supposing value is the number of lines that you want
        var lines = File.ReadAllLines(@"M:\\dictionar.txt");
        Random rnd = new Random();
        if (path != null && Directory.Exists(path))
        {
            for (int i = 0; i < value; i++)
            {
                Directory.CreateDirectory(path + "\\" + StringRandomize.Randomize(lines[rnd.Next(0,lines.Length)]));
            }
        }
    }
  

“pers3o7Nal”

     

“足球”