关于我的代码的一些背景,我基本上有一个记录类,它有很多属性来捕获以.txt文件形式提供的所需数据,每列被分成各自独立的文件,即Month.txt,Day .txt,每行包含600行数据。
现在,我有一个第二个数组,它基本上是上述类的集合,我给它的最大值为600(因为有600个数据)。该类拥有初始化方法。
这样它当时每列都初始化我的记录,但我必须知道行的固定大小不会超出范围异常的索引。此外,我有很多属性,所以整体" if else"语句使这段代码看起来非常多余且难以理解。灵活性也是一个问题,因为该点重置为0,因此当我想添加额外数据时,我将覆盖原始600.
无论如何要改善这个吗?
答案 0 :(得分:1)
代码不是最理想的,因为它会检查该文件中每一行的文件名。最好在循环之前确定要设置的字段,然后在整个循环中使用该决策。
首先,根据文件前缀:
创建一个setter查找表var setters = new Dictionary<string,Action<Record,string>> {
["Day"] = (r,v) => r.Day = v
, ["Month"] = (r,v) => r.Month = v
, ...
};
通过这种查找,阅读代码变得简单明了:
using (StreamReader R = new StreamReader(file.FullName)) {
var pos = File.Name.IndexOf("_");
Action<Record,string> fieldSetter;
if (pos < 0 || !setters.TryGetValue(File.Name.Substring(0, pos), out fieldSetter)) {
continue; // Go to next file
}
string temp;
while((temp = R.ReadLine()) != null) {
fieldSetter(records[pointer++], temp);
}
}
首先,我们使用文件名中的前缀直到第一个下划线字符'_'
来查找setter。然后我们遍历文件中的行,并为每个传递我们得到的字符串的记录调用该setter。
添加新字段也很简单,因为您只需要在setters
初始值设定项中添加新行。