有可能为C#Windows应用程序提供某种内部存储吗?

有可能为C#Windows应用程序提供某种内部存储吗?,c#,windows-applications,C#,Windows Applications,我已经创建了一个小应用程序,通过点击按钮生成一个随机数,目前我正在将该数字保存在一个.txt文件中 private void button1_Click(object sender, EventArgs e) { Random rnd = new Random(); int random = rnd.Next(1, 10000); // saving to a file is not an option! //File.AppendAllText(@"C

我已经创建了一个小应用程序,通过点击按钮生成一个随机数,目前我正在将该数字保存在一个.txt文件中

private void button1_Click(object sender, EventArgs e)
{
    Random rnd = new Random();
    int random = rnd.Next(1, 10000);
    // saving to a file is not an option!
    //File.AppendAllText(@"C:\Users\Public\no.txt", random + Environment.NewLine);
}
要解决的问题是,这个随机生成的数字必须是唯一的(范围从1到9999),因此每次生成该数字时,我都会检查该数字之前是否生成过。但要做到这一点,我必须保留每个生成的数字的记录,以便能够检查、比较,如果存在,则生成一个新的数字,直到所有数字都被使用

所以问题是:是否有可能在应用程序中保存一个记录,这样我就不必创建任何额外的文件

更新 关闭应用程序后,必须保存以前的号码才能创建唯一的新号码

没有用于.NET程序集的“内部存储”。保存文件有什么错

  • 使用而不是硬编码字符串

  • 考虑使用AppData或AppData

  • 另外,如果您想轻松地管理运行时对象,可以使用


    您还可以使用或数据库来保存数据。

    我认为简单的答案是调整函数在应用程序上下文中的工作方式

    我将改变逻辑如下:

    • 程序运行时,将列表保留在数组中
    • 当需要添加新数字时,请调整数组大小,然后添加它
    • 退出时,将数组内容保存到文件中(按照您选择的格式,我个人会使用逗号分隔)
    • 启动时,加载文件并填充数组(如果用逗号或其他字符分隔,请将其读入字符串并使用split函数)
    调整阵列大小的主要代码/片段包括:

    // should be in an accessible class scope - public or maybe even static
    int[] myList = new list[0];             //start at 0 or empty
    
    //function ressize Array by 1, accessible class scope - public or even static
    static public int[] incrementIntArrayBy1(int[] oldArray){
            int[] newArray = new int[oldArray.Length + 1];
            Array.Copy(oldArray, newArray, oldArray.Length);
            return newArray;
        } 
    
    //function on button
    private void button1_Click(object sender, EventArgs e){
        mylist = incrementIntArrayBy1(myList);
        myList[myList.length-1] =  new Random().Next(1, 1000);
    }
    
    System.Configuration.Configuration=ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath);
    randoms=string.IsNullOrEmpty(ConfigurationManager.AppSettings[“randoms”])?新建列表():ConfigurationManager.AppSettings[“randoms”]。拆分(',')。选择(int.Parse).ToList();
    随机rnd=新随机();
    int random=rnd.Next(11000);
    如果(!randoms.Contains(random))
    {
    随机添加(随机);
    config.AppSettings.Settings.Add(“randoms”,string.Join(“,”,randoms.Select(p=>p.ToString()).ToList());
    config.Save(ConfigurationSaveMode.Minimal);
    }
    
    您可以定义应用程序中的密钥设置:

    
    

    我不确定config.AppSettings.setting.Add的工作原理。我认为它通过连接增加了前一个的价值

    我会生成稍微不同的随机数

  • 创建一对存储在一起的整数
  • 将所有数字1到9999存储为配对中的第一个数字
  • 生成一个随机整数作为第二个数字(任意大小)
  • 按第二个数字对配对进行排序
  • 将这些对保存在一个文件中
  • 如果需要1到9999之间的整数,请读取列表中的下一个数字
  • 阅读完所有内容后,返回步骤3


  • 这样就不必检查所有数字,以查看它们是否是以前生成的,这可能会在您到达最后几个数字时造成延迟。

    因此,您想删除File.AppendAllText?是的……这是临时解决方案!最好的情况是,应用程序本身以某种方式在内部保存了一个数组…不创建任何其他文件。您希望在下次运行应用程序时,此信息可用吗?另外,按钮可能被按下多少次?一个简单的解决方案是使用应用程序变量。Application[“Randoms”]保存列表的串联值,并在启动应用程序时通过拆分值再次读取。当应用程序关闭时,必须保存该数组,因此下次启动应用程序时,我必须拥有以前生成的数字。这是我认为最棘手的部分…(应用程序关闭)我无法创建任何其他文件,这不是一个选项。。。什么是ProgramData或AppData?它是永久性的吗?保存到注册表将是一个选项!ProgrammData/AppData只是用于存储设置的特殊文件夹。无法将数据保存到exe,您需要一些存储空间。我添加了一个指向regsitry教程的链接。是的,所以现在我在检查以前生成的数字时遇到了问题。我可以简单地为每个生成的数字保存一个新的注册表项,然后为新的数字简单地检查是否存在具有这样或那样值的项吗?我只需要简单地创建一个键,使用字符串连接和拆分方法来存储整数数组。不确定是否有更好的方法,我通常不使用注册表。你们都认为Aryan Firouzyan的答案如何?保存到文件不是我的选择。为什么不使用
    List
    而不是自己编写所有这些代码呢?考虑到它是一个简单的整数数组,似乎没有必要。lewis4u,你提到的问题“任何其他文件”-这将使用与您当前拥有的相同的“1”文件。您可以将它们放入HKEY_LOCAL_计算机或当前用户注册表项(如有人建议的,取决于您的需要)-如果您正在序列化生成的数字或将其保存为逗号分隔的列表,这将是微不足道的。我是否可以将新值保存到该项=”randoms“在应用程序启动后,当应用程序关闭时,最后保存的值应该在那里???我尝试了,当我关闭时,它正在工作,然后再次启动应用程序(可以从键中读取以前的值)。但我对config.AppSettings.Settings.Add的工作原理感到困惑。您可以通过应用程序逻辑来修复它。我会在一天结束前检查并发布结果!注册表项是否可以有一个值数组?我的意思是将
    key=>value
    作为
    key=>[value,value2,value3]
    是的,我放弃了。我正在注册表中保存数组