Заполнить массив один раз и ссылаться позже - PullRequest
0 голосов
/ 29 сентября 2018

У меня есть приложение, которое выбирает случайное слово из текстового файла, загруженного в массив,

В настоящее время я делаю это:

.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 голосов
/ 29 сентября 2018

Существует простой и оптимизированный код для извлечения произвольного текста из файла.

public string GetRandomText()
{
    Random r = new Random();
    int _maxLine = 1000;
    return File.ReadLines("C:\\txtWords.txt").Skip(r.Next(1, _maxLine)).Take(1).First();
}
0 голосов
/ 29 сентября 2018

Ваш вопрос касается кода, которым вы не делитесь, что затрудняет выполнение чего-либо, кроме обеспечения альтернативной реализации кода, которым вы делитесь ...

Приведенный ниже код является минимальным изменениемкод, которым вы поделились, чтобы заставить его вести себя так, как вы говорите, что хотите.Обратите внимание, что это не потокобезопасно.

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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...