C# 将一系列字符串序列化到文件,并将随机选择读回文件

C# 将一系列字符串序列化到文件,并将随机选择读回文件,c#,serialization,C#,Serialization,我正在做一个游戏,游戏中的人物是随机产生的,包括他们的名字。我打算把名字分成2-4部分(前缀、中间、后缀);每个部分将是一个短(1-4个字符)字符串,从文件中随机选择并组合以创建全名。例如,如果文件中选定的部分为“bor”、“o”和“mir”,则角色的名称应为“Boromir” 填充此文件(如我所说,它需要包含大量1-4个字符串)、序列化它,然后根据需要随机读取这些字符串的理想方式是什么 我真的没有太多的想法可供考虑;我以前从未做过类似的事情,但任何提示或建议都将不胜感激。谢谢。假设您将名称存储

我正在做一个游戏,游戏中的人物是随机产生的,包括他们的名字。我打算把名字分成2-4部分(前缀、中间、后缀);每个部分将是一个短(1-4个字符)字符串,从文件中随机选择并组合以创建全名。例如,如果文件中选定的部分为“bor”、“o”和“mir”,则角色的名称应为“Boromir”

填充此文件(如我所说,它需要包含大量1-4个字符串)、序列化它,然后根据需要随机读取这些字符串的理想方式是什么


我真的没有太多的想法可供考虑;我以前从未做过类似的事情,但任何提示或建议都将不胜感激。谢谢。

假设您将名称存储在一个文本文件中,每行一个名称,您可以使用System.IO.file类中的ReadAllLines()方法将所有名称读入字符串[]

类似地,可以使用writeAllines()将字符串[]写回文件

将文件读入字符串[]后,可以使用System.random class Next()方法从数组中选择随机字符串


使用模运算符将结果约束为字符串[]的有效索引,因此我编写了一个快速示例,说明了我在注释中暗示的内容。我使用windows窗体应用程序作为运行时示例。当表单加载时,它从单个文件中读取名称部分一次,然后获取随机值以形成名称

零件名称将存储在纯文本文件中,每行一个零件,如下所示:

prefix.txt

far
bar
dun
brat
您可以对每个文件使用相同的格式(每行一个字)

现在,有趣的部分:

public partial class Form1 : Form
    {
        private readonly Random _random = new Random();
        private string[] _prefixParts;
        private string[] _middleParts;
        private string[] _suffixParts;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // Only read the data from each file once as this could be expensive
            _prefixParts = PopulateFromFile("prefix.txt"); // alter your path as necessary
            _middleParts = PopulateFromFile("middle.txt");
            _suffixParts = PopulateFromFile("suffix.txt");
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // Generate a random name
            randomNameLabel.Text = GetRandomName();
        }

        private string[] PopulateFromFile(string path)
        {
            return File.ReadAllLines(path);
        }

        private string GetRandomName()
        {
            // this will get a random name part from each of the arrays, concatenate and return the complete name
            return GetRandomNamePart(_prefixParts) + GetRandomNamePart(_middleParts) + GetRandomNamePart(_suffixParts);
        }

        private string GetRandomNamePart(string[] array)
        {
            // this will return a random value from the array
            return array[_random.Next(array.Length)];
        }
    }

文件只是一系列无序的名称?还是有一个结构?i、 e.文件中的第一个x名称可以用作“第一个”,第二个y名称可以用在中间。我考虑了两种方法:第一种方法是每个字符串对于任何名称部分都是公平的,另一种方法是为前缀、中间和后缀指定字符串。我认为后者可能更好。我不确定你所说的“理想”是什么意思——这取决于你的问题的限制。如果您需要某种排序/索引/搜索功能,那么文件并不理想。考虑一个SQL CypS/SQL Express数据库或类似的东西。(我假设这是一个移动应用。)这些“名字”会在数据库中吗?如果是这样,您可以使一个主整数自动递增,并查询数据库以了解最大的数字,然后在该范围内进行随机设置。我将为不同的部分使用单独的文件或表格。如果它们不作为唯一的“记录”相互关联,那么将它们放在同一个文件或表中没有多大意义。你愿意接受吗?prefix.txt middle.txt和suffix.txt,然后将其中的每一个读入一个数组,并随机获得一个来生成您的名字。如果你愿意的话,我可以用一个答案来解释。谢谢你的回答。我得过一会儿再查。我的MVVM灯决定停止工作,现在我的程序根本无法运行。当然,我大部分时间都在。如果你有问题,请告诉我,也许你能帮我解决这个问题。我在NameSpace.Utility.Names.nameXXX.txt中有每个文本文件-您发布的类也在NS.Utility.Names中。我访问文本文件需要什么路径?我尝试过的每一种方法都导致程序崩溃。我发布了一个关于它的问题,但到目前为止,没有人真正提供帮助。如果您能帮我解决这个问题,我将非常感激。您可以用buildaction:Content标记文本文件,并将Copy设置为Output Directory:Copy Always。这样就可以将文件复制到相关的bin文件夹中,而不需要提供路径,只需提供文件名即可,无需使用模数运算符<代码>随机。下一步(100)将给您一个0-99之间的数字,包括0-99。因此,如果字符串数组被称为
names
,那么
Random.Next(names.Length)
将把选择限制在数组的边界上。顺便说一下,模是一种很糟糕的约束方式,因为它会引入扭曲。看,你是对的,Next(int)是一个更好的方法,但它也有不同类型的偏见。尽管我怀疑在原始问题的上下文中,这一切都很重要