gpt4 book ai didi

c# - 读一个文件,谁的行改变类型

转载 作者:太空宇宙 更新时间:2023-11-03 14:21:10 25 4
gpt4 key购买 nike

这应该很简单,但今天早上大脑还没有完全吸收咖啡因。

我有一个发票文件(实际上是数据集,但是,无论如何)。我正在逐行阅读,自上而下。如果该行的类型列中有一个 O,则它是新订单的开始,并且包含订单信息和部分标题详细信息。当它包含 S 时,它具有子部分的相同标题详细信息。其他行是其各自部分的详细信息,包括项目编号和数量(与 O/S 行中的标题相关)。

例子

O  o123  typea typeb typec
1234 3 2 6
2345 1 0 2
S typed typee typef
1634 3 2 6
2645 1 0 2
O o123 typea typeb typec
1234 3 2 6
2345 1 0 2
S typed typee typef
1634 3 2 6
2645 1 0 2
S typed typee typef
1634 3 2 6
2645 1 0 2

我没有为更改类型和处理读取文件的状态机方面而苦苦挣扎。我正在苦苦挣扎的是对象模型。

我最初将该行读入通用线类,然后需要将其转换为正确的类型...但是布置这些类的正确方法是什么?我的界面应该是什么样子,这样我才能把它写得干净利落。是否应该有一个抽象类?

如果有所不同,我将使用 c#(框架 3.5)进行编码。

谢谢

最佳答案

你应该使用一些 Factory Method 的味道模式。

这通常通过派生自公共(public)基类的多个类或实现公共(public)接口(interface)来实现——这取决于类之间的关系。让我们选择第二个选项并假设 ICommon .然后,您将“独特值”的映射填充到 Action<ICommon> 的实例。 .

在你的例子中,我们可能有:

var map = Dictionary<string, Action<ICommon>()
{
{ "O", () => new Order() },
{ "S", () => new Subsection() },
};

然后,您创建工厂方法,它接受您的任何输入,从映射中找到适当的操作,创建对象并将其返回给调用者:

public static ICommon CreateCommon(FileLine line)
{
// assume map is visible
var producer = map[line.Type];
return producer();
}

这就是它的全部。通常所有这些都打包到一个静态类中,并且根据您的情况的具体情况, map 可能会填充硬编码数据,或者通过某种算法自动填充(想想 static 打包这些类的构造函数)或者甚至以编程方式通过使用工厂方法之前的代码。

关于c# - 读一个文件,谁的行改变类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5340067/

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