我真的很抱歉。这看起来似乎是一个令人难以置信的愚蠢问题,但除非我问我永远不会弄清楚。我正在尝试编写一个程序来读取Visual Basic中的csv文件(试过并放弃了C#)然后我问了我的一个朋友,他的编程比我好得多。他说我应该创建一个类来保存我读过的数据。
问题是,我以前从未创建过类,而不是VB,Java或其他任何类。我知道与课程相关的所有术语,我从很高的层面理解课程如何工作没有问题。但我对制作一个的实际细节很感兴趣。
所以这就是我所做的:
Public Class TsvData
Property fullDataSet() As Array
Get
Return ?????
End Get
Set(ByVal value As Array)
End Set
End Property
End Class
我得到了问号,我被卡住了。 该类将包含大量数据,因此我将其设为数组。这可能是一个糟糕的举动。我不知道。我所知道的是它不能是一个字符串,它肯定不能是一个整数或浮点数。
至于Getter和Setter,我把问号放入的原因是因为我想在那里返回整个数组。该类最终将具有其他属性,这些属性基本上是相同数据的排列,但这是我想要保存它或其他东西时将使用的完整集。现在我想返回整个数组,但输入“Return fullDataSet()”似乎不是一个好主意。我的意思是,属性的名称是“fullDataSet()”。它只会产生某种循环。但是没有其他数据可以返回。
我是否应该在属性内部另外另一个数组,它已经是一个数组,然后返回它?
答案 0 :(得分:3)
理想情况下,您应该有一个表示您想要读取的特定数据的类。一次设置整个数组就会遇到麻烦;如果所有行都没有相同的列数,那么读取{C,T} SV文件的某些程序会变得很糟糕,如果您可以将数据设置为任意长度的数组,则非常容易。
如果你试图表示任意数据,坦率地说,你也可以使用List(Of String)
。如果它是一个表,你可以在第一行读取并使其成为上面的列表(让我们称之为“标题”),然后使每一行成为Dictionary(Of String, String)
。 (让我们将每一行称为“行”,并将集合(这些字典对象的列表)称为“行”。)只需读取行,将其拆分为第一行,然后为每行写row(headers(column number)) = value
之类的内容列,然后将其填入“行”。
或者,您可以使用数据类(System.Data.DataTable
和System.Data.DataSet
会在这里创造奇迹)。
答案 1 :(得分:3)
您可以熟悉预定义的课程System.Data.DataTable
,然后使用它来保存CSV数据,而不是编写自己的课程。
在我编程的最近几年里,我从未真正使用多维数组,我建议你也不要使用它们。通常有更好的数据结构来实现相同的方法。例如,考虑创建一个只包含一条记录的类(让我们称之为CsvRecord
);也就是说,只有CSV文件中的一行。然后使用System.Collections.Generic
命名空间中的任何标准集合类型(例如List(Of CsvRecord)
)来保存CSV文件中的所有数据(即所有行)。这有效地将问题减少到“我如何读取一行CSV数据?”
如果您想进一步提出建议#2,请按 cHao 说明,而不是简单地将您读过的信息列为CsvRecord
;相反,创建一个反映实际内容的对象。例如,如果您的CSV文件包含产品价格信息,请调用您的CSV记录类ProductInfo
或其他更合适的内容。
但是,如果您想继续使用当前的方法,则需要支持字段来显示该属性,如 Philipp 所示回答。然后你的财产变成了一个“façade”,它只代表这个支持领域。这不是绝对必要的:你可以简单地制作支持字段Public
并让你的班级用户直接访问它,虽然这不是一个好习惯。
答案 2 :(得分:2)
通常您使用私有成员来存储实际数据:
Public Class TsvData
Private _fullDataSet As String()
Public Property FullDataSet() As String()
Get
Return _fullDataSet
End Get
Set(ByVal value As String())
_fullDataSet = value
End Set
End Property
请注意,这是一个糟糕设计的实例,因为它将概念与具体表示相结合,并允许类的客户端修改内部结构而不进行任何错误检查。返回ReadOnlyCollection
或某个专用容器会更好。