一次填充数组,以后再引用

时间:2018-09-29 11:47:25

标签: c# arrays xamarin

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

我目前正在这样做:

.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" />

xaml.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中引用该数组?

构造代码以实现此目标的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

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

下面的代码是对您共享的代码的最小更改,以使其按您希望的方式运行。请注意,它不是线程安全的。

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

答案 1 :(得分:1)

有一个简单且经过优化的代码可以从文件中提取随机文本。

public string GetRandomText()
{
    Random r = new Random();
    int _maxLine = 1000;
    return File.ReadLines("C:\\txtWords.txt").Skip(r.Next(1, _maxLine)).Take(1).First();
}