是否可以为C#Windows App提供某种内部存储空间?

时间:2017-10-28 10:41:50

标签: 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:\Users\Public\no.txt", random + Environment.NewLine);
}

要解决的问题是此随机生成的数字必须是唯一的(范围从1到9999),因此每次生成数字时,我都会检查该数字是否先前生成过。但要做到这一点,我必须保留每个生成的数字的记录,以便能够检查,比较,如果存在,则生成一个新数字,直到使用所有数字。

所以问题是:是否有可能以某种方式在应用内部保留记录,以便我不必创建任何其他文件?

更新

关闭应用后,必须保存以前的数字才能创建唯一的新号码!

4 个答案:

答案 0 :(得分:4)

.NET程序集没有“内部存储”。保存文件有什么问题?

  1. 使用Special Folder代替硬编码字符串

  2. 考虑使用 ProgramData AppData

  3. 此外,如果您想轻松管理Runtime对象,可以使用Serialization

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

答案 1 :(得分:1)

System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath);
randoms = string.IsNullOrEmpty(ConfigurationManager.AppSettings["randoms"]) ? new List<int>() : ConfigurationManager.AppSettings["randoms"].Split(',').Select(int.Parse).ToList();
Random rnd = new Random();
int random = rnd.Next(1, 10000);
if (!randoms.Contains(random))
{
    randoms.Add(random);
    config.AppSettings.Settings.Add("randoms", string.Join(",", randoms.Select(p => p.ToString()).ToList()));
    config.Save(ConfigurationSaveMode.Minimal);
}

您可以在应用设置中定义键:

<configuration>
  <appSettings>
    <add key="randoms" value="" />
  </appSettings>
  <startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
 </startup>
</configuration>

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

答案 2 :(得分:0)

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

我会改变逻辑如下:

  • 程序运行时,请将列表保留在数组中。
  • 当您需要添加新号码时,请调整阵列大小,然后添加
  • 当您退出时,将数组内容保存到文件中(以您选择的格式,我个人将其逗号分隔)
  • 启动时,加载文件并填充数组(如果用逗号或其他字符分隔,请将其读入字符串并使用拆分功能。)

调整数组大小的重要代码是:

// 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);
}

答案 3 :(得分:0)

我会略微不同地生成随机数。

  1. 创建一对存储在一起的整数。
  2. 将所有数字1到9999存储为对中的第一个数字
  3. 生成随机整数作为第二个数字(任意大小)
  4. 对第二个数字
  5. 上的对进行排序
  6. 将这些对保存在文件
  7. 如果需要1到9999之间的整数,请阅读列表中的下一个数字
  8. 当您全部阅读完毕后,请返回第3步。
  9. 这可以防止必须检查所有数字以查看它们之前是否已生成,这可能会在您到达最后几个数字时导致延迟。