Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 填充数组一次,以后再引用_C#_Arrays_Xamarin - Fatal编程技术网

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

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

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

我现在这样做:

.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;
        }
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,也许这就是问题的根源,它应该只加载一次。抱歉,我误解了你的意思。