我有一个应用程序,可以从加载到数组中的文本文件中选择一个随机词,
我目前正在这样做:
.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中引用该数组?
构造代码以实现此目标的最佳方法是什么?
答案 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();
}