有没有更好的方法来初始化记录数组,使其更具动态性? C#

时间:2017-04-05 02:52:15

标签: c# initialization records

关于我的代码的一些背景,我基本上有一个记录类,它有很多属性来捕获以.txt文件形式提供的所需数据,每列被分成各自独立的文件,即Month.txt,Day .txt,每行包含600行数据。

现在,我有一个第二个数组,它基本上是上述类的集合,我给它的最大值为600(因为有600个数据)。该类拥有初始化方法。

这样它当时每列都初始化我的记录,但我必须知道行的固定大小不会超出范围异常的索引。此外,我有很多属性,所以整体" if else"语句使这段代码看起来非常多余且难以理解。灵活性也是一个问题,因为该点重置为0,因此当我想添加额外数据时,我将覆盖原始600.

无论如何要改善这个吗?

1 个答案:

答案 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初始值设定项中添加新行。