0

我创建了一个带有 3 个按钮的 WindowsForm 应用程序。单击任何按钮可读取c:\data.txt并执行不同的数据“分析”。按钮 1 可能会将数字相加data.txt,按钮 2 可能会平均它们,按钮 3 可能会将它们相乘。

在每一个下,private void button1_Click我都有一行代码从 data.txt 中读取数据。这对我来说似乎效率低下,因为在 3 个按钮单击事件中的每一个中都有相同的“ReadLines”代码。

有没有办法只读取一次数据,然后让我的按钮执行分析?

这样,“ReadLines”代码只使用一次,并且数据以某种方式与任何button1_Click事件共享。

4

4 回答 4

5

这并不难——你需要有一个字段来保存你读取的值——该字段将可用于类中的所有函数。

 private string[] data;

 // in constructor:
 data = File.ReadAllLines(@"c:\data.txt");

 // in your methods, simply use data

另一种选择是有一个LoadData方法来检查是否data存在null并从您的方法中调用它:

private void LoadData()
{
  if(data == null)
    data = File.ReadAllLines(@"c:\data.txt");
}
于 2012-09-12T15:28:31.000 回答
2

如果您想进一步最大化效率,您可以使用字段和属性来延迟加载它。

private string[] _data;

private string[] Data
{
    get
    {
        return _data ?? _data = File.ReadAllLines(@"c:\data.txt");
    }
}

现在,您的调用代码可以直接使用该属性,而无需检查该字段是否为空,并且您在需要之前不会加载数据。

于 2012-09-12T15:34:43.190 回答
1

向您的类添加将执行延迟加载的属性。

首先添加一个存放数据的地方

private string[] _FileData;

然后添加一个新属性

private string[] FileData 
{ 
    get
    {
        if (_FileData != null && _FileData.Length > 0)
            return _FileData;

        _FileData = File.ReadAllLines(@"c:\data.txt");

        return _FileData;
    }
}

然后只需使用 FileData 属性来获取文件文本。它只会在第一次获取文件文本,之后_FileData将保存您的文件,并且在您访问FileData.

于 2012-09-12T15:30:07.243 回答
1

这是一个同样通用的答案;)

您可以声明一个共享变量(例如 a string),在每个按钮单击处理程序上,您检查它是否为空或 null ( String.IsNullOrEmpty(myString))。如果它为空,请执行ReadLines代码并将数据存储在string变量中。然后对变量进行处理。

下次单击按钮时,您将看到您string的不是空的,只需处理字符串,而不必再次读取文件。

于 2012-09-12T15:30:32.387 回答