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

Is there a better way to Initialize a record array to make it more dynamic? C#

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

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

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

有什么可以改进的吗?

该代码不是最理想的,因为它会检查该文件中每一行的文件名。最好在循环之前决定设置哪个字段,然后在整个循环中使用该决定。

首先,根据文件前缀查找table个setters:

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 初始值设定项添加新行即可。