我用3个按钮创建了一个WindowsForm应用程序。单击任何按钮会显示c:\data.txt
并对数据执行不同的“分析”。按钮1可能会在data.txt
中添加数字,按钮2可能会对它们进行平均,按钮3可能会将它们相乘。
在每个private void button1_Click
下,我有一行代码从data.txt读取数据。这对我来说似乎效率低下,因为在3个按钮点击事件中每个都有相同的“ReadLines”代码。
有没有办法只读ON数据,然后让我的按钮执行分析?
这样,“ReadLines”代码只使用一次,并且数据以某种方式与任何button1_Click
事件共享。
答案 0 :(得分: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");
}
答案 1 :(得分:2)
如果您想进一步提高效率,可以使用字段和属性来延迟加载它。
private string[] _data;
private string[] Data
{
get
{
return _data ?? _data = File.ReadAllLines(@"c:\data.txt");
}
}
现在,您的调用代码只需使用该属性,而无需检查该字段是否为空,并且在您需要之前不加载数据。
答案 2 :(得分: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
时它将被返回。
答案 3 :(得分:1)
这是一个同样通用的答案;)
您可以声明一个共享变量(例如string
),在每个按钮单击处理程序上,您检查以查看是空的还是空(String.IsNullOrEmpty(myString)
)。如果它为空,请执行ReadLines
代码并将数据存储在string
变量中。然后对变量进行处理。
下次单击按钮时,您将看到string
不为空,只处理字符串,而不必再次读取文件。