C# 填充数组一次,以后再引用
我有一个应用程序,可以从加载到数组中的文本文件中选择一个随机单词 我现在这样做: .xaml:C# 填充数组一次,以后再引用,c#,arrays,xamarin,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" Clic
<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;
}
async void GetWord(对象发送方,事件参数e)
{
var WordsList=新列表();
使用(var stream=await FileSystem.OpenAppPackageFileAsync(“txtWords.txt”))
使用(变量读取器=新的流读取器(流))
{
弦线;
而((line=reader.ReadLine())!=null)
{
添加(行);
}
}
string[]allWords=WordsList.ToArray();
var random=新的random();
int randNum=random.Next(1267751);/*txtWords.txt中的最大行数*/
字符串newWord=allWords[randNum];
GameWords.Text=newWord;
}
如您所见,每次按下按钮都会将整个文件txtWords.txt(267751个单词)加载到一个名为allWords的数组中
理想情况下,我要做的是加载数组一次,可能是在应用程序加载时,然后在GetWord函数中引用它。如果我将加载数组的代码段移到函数外部,我似乎无法在GetWord中引用数组
构建我的代码以实现这一目标的最佳方式是什么?您的问题是关于您不共享的代码,这使得除了提供您共享的代码的替代实现之外,很难做任何事情 下面的代码是对您共享的代码的最小更改,以使其按照您希望的方式运行。请注意,它不是线程安全的
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;
}
私有静态列表WordsList;
异步void GetWord(对象发送方,事件参数)
{
if(WordsList==null){
WordsList=新列表();
使用(var stream=await FileSystem.OpenAppPackageFileAsync(“txtWords.txt”))
使用(变量读取器=新的流读取器(流))
{
弦线;
而((line=reader.ReadLine())!=null)
{
添加(行);
}
}
}
string[]allWords=WordsList.ToArray();
var random=新的random();
int randNum=random.Next(1267751);/*txtWords.txt中的最大行数*/
字符串newWord=allWords[randNum];
GameWords.Text=newWord;
}
有一个简单优化的代码,用于从文件中提取随机文本
public string GetRandomText()
{
Random r = new Random();
int _maxLine = 1000;
return File.ReadLines("C:\\txtWords.txt").Skip(r.Next(1, _maxLine)).Take(1).First();
}
这看起来很有用,但是如何将File.ReadLines()与StreamReader一起使用?{File.ReadLines()}返回一个{IEnumerable},它不会一次读取整个文件,因此在处理大文件时,它确实是一个更好的选择。从MSDN:>ReadLines和ReadAllLines方法的区别如下:使用ReadLines时,可以在返回整个集合之前开始枚举字符串集合;使用ReadAllLines时,必须等待返回整个字符串数组,然后才能访问该数组。因此,当您处理非常大的文件时,ReadLines可以更高效。谢谢您,但这不是我所要求的。在应用程序中获取文件路径与在PC上访问文件不同。据我所知,您不能给出明确的路径(例如
“C:\\txtWords.txt”
)。我使用的是FileSystem.OpenAppPackageFileAsync
,它返回应用程序包中包含的文件的流。我的问题是在这种情况下如何使用ReadLines()
?对不起,我忘记了流。我想你可以将文件存储在服务器上,然后使用我发送给你的上述示例,编写文件的成本比读取整行代码要低,这比读取所有行代码要高效。我共享的代码基本上是整个代码,减去几个不相关的块。这段代码并没有达到我想要的效果;每次调用GetWord时,它仍然会将整个文本文件读取到WordsList。尽管如此,还是要感谢您的努力。@WillC:您发布的代码不是您不能引用数组的代码。至于我的修改,我有一个打字错误,WordList vs WordsList,也许这就是问题的根源,它应该只加载一次。抱歉,我误解了你的意思。