gpt4 book ai didi

c# - 从固定宽度数据填充大类

转载 作者:行者123 更新时间:2023-11-30 17:40:36 25 4
gpt4 key购买 nike

我有一个包含大量属性的类,例如:

class MyStudent {
public string NAME;
public string TUTOR;
public int AGE;
// ... 100+ items
}

数据从固定宽度的文本文件中读取:

Matt    John    20
JonathonBob 22

数据文件在单独的外部参照文件中定义:

NAME    8
TUTOR 8
AGE 2

我想从每一行数据填充我的类,然后将其添加到这种类型的列表中。这是我正在使用的方法,是否可以提高效率(不更改输入数据文件)?

首先,我将外部参照文件读入列表,以便我可以使用 LINQ 访问 WIDTH 字段。

/* Read File */
List<MyStudent> signal_file = new List<MyStudent>();
while ((_dba_line = _dba_file.ReadLine()) != null)
{
if (!_dba_line.Substring(0, 2).Equals("--")) // Not a comment
{
MyStudent temp_signal = new MyStudent();
int _offset = 0;
int _width = 0;

_width = xref_file.First(item => item.DBU_FIELD == "NAME").WIDTH;
temp_signal.NAME = _dba_line.Substring(_offset, _width).Trim();
_offset += _width;

_width = xref_file.First(item => item.DBU_FIELD == "TUTOR").WIDTH;
temp_signal.TUTOR = _dba_line.Substring(_offset, _width).Trim();
_offset += _width;

// Continue for each property
// ...

// Finally
signal_file.Add(temp_signal);
}
}

我认为关键可能是外部参照 DBU_FIELD 始终等于类中的属性名称,并且顺序正确以匹配数据行。如果可能的话,我想实现的目标更接近于:

foreach (XrefObject x in xref_file)
{
_width = x.WIDTH;
temp_signal.(x.DBU_FIELD) = _dba_line.Substring(_offset, _width).Trim();
_offset += _width;
}

// Finally
signal_file.Add(temp_signal);

它是如何使用外部参照对象 DBU_FIELD 值来访问我不确定(如果可能)的学生对象关联属性。

有关此用途的信息,文件在使用前已经过验证,因此可以保证它们正确匹配。

如果更有意义的话,我愿意创建一个结构而不是一个对象,通常有 500 个实例,每个实例都有大约 100 个混合字符串、int 和 float 的字段。

我也在寻找处理此类数据结构的最佳实践方法,而不仅仅是强制它工作。

最佳答案

您可以使用 ReflectionGetPropertySetValue 方法

using System.Reflection;        

foreach (XrefObject x in xref_file)
{
_width = x.WIDTH;

PropertyInfo prop =
temp_signal.GetType()
.GetProperty(x.DBU_FIELD, BindingFlags.Public | BindingFlags.Instance);

if(prop != null && prop.CanWrite)
{
prop.SetValue(temp_signal, _dba_line.Substring(_offset, _width).Trim(), null);
}

_offset += _width;
}

关于c# - 从固定宽度数据填充大类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34174105/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com