首页 > 解决方案 > 填充数组一次并稍后引用

问题描述

我有一个应用程序,它从加载到数组中的文本文件中选择一个随机单词,

我目前这样做:

.xaml:

<Label x:Name="GameWords" Text="Press 'Generate a Word' to get started" HorizontalOptions="Center" VerticalOptions="CenterAndExpand"/>

<Button x:Name="GenerateWord" Text="Generate a Word" Clicked="GetWord" />

xml.cs:

async void GetWord(object sender, EventArgs e)
        {
            var WordsList = new List<string>();
            using (var stream = await FileSystem.OpenAppPackageFileAsync("txtWords.txt"))
            using (var reader = new StreamReader(stream))
            {
                string line;
                while ((line = reader.ReadLine()) != null)
                {
                    WordsList.Add(line);
                }
            }
            string[] allWords = WordsList.ToArray();
            var random = new Random();
            int randNum = random.Next(1, 267751); /*Max lines in txtWords.txt */
            string newWord = allWords[randNum];
            GameWords.Text = newWord;
        }

如您所见,每次按下按钮都会将整个文件 txtWords.txt(267751 个单词)加载到一个名为 allWords 的数组中。

理想情况下,我想要做的是加载一次数组,可能是在应用程序加载时,然后在 GetWord 函数中引用它。如果我将加载数组的代码部分移到函数之外,我似乎无法在 GetWord 中引用该数组?

构建我的代码以实现这一目标的最佳方法是什么?

标签: c#arraysxamarin

解决方案


您的问题是关于您不共享的代码,除了提供您共享的代码的替代实现之外,很难做任何事情......

下面的代码是对您共享的代码的最小更改,以使其按您所说的那样运行。请注意,它不是线程安全的。

private static List<string> WordsList;

async void GetWord(object sender, EventArgs e)
    {
        if (WordsList == null) {
            WordsList = new List<string>();
            using (var stream = await FileSystem.OpenAppPackageFileAsync("txtWords.txt"))
            using (var reader = new StreamReader(stream))
            {
                string line;
                while ((line = reader.ReadLine()) != null)
                {
                    WordsList.Add(line);
                }
            }
        }
        string[] allWords = WordsList.ToArray();
        var random = new Random();
        int randNum = random.Next(1, 267751); /*Max lines in txtWords.txt */
        string newWord = allWords[randNum];
        GameWords.Text = newWord;
    }

推荐阅读