我有一个.NET项目,其中上传Excel并逐行转换为对象。这很好。
我已经定义了一个枚举,用于在Excel文件中的列和列的索引之间创建映射,我需要从列中获取值
如此:
Public Enum ColumnIndexEnum
FirstName = 1
LastName = 2
Address = 3
...
End Enum
这是这样使用的:(伪代码)
Dim row = 1
WorkSheet.GetValue(ColumnIndexEnum.FirstName, row)
我过去曾使用枚举来输入新列。我可以通过输入新条目来编辑Enum,而不必更改任何读取特定列的代码
现在我必须进行一些更改,其中某些列在某些情况下会消失,但在其他情况下会返回。换句话说:有时列FirstName将是第一列(索引1),有时候,它将是第二列。
我不知道如何最好地接近这一点。我正在考虑创建第二个枚举并切换我使用的枚举,但无法找到有关如何创建指向一个枚举或另一个枚举的变量的任何细节。
有没有人对此有任何想法?我在这个项目中使用VB.NET
答案 0 :(得分:1)
你不能拥有“指向一个枚举或另一个枚举的变量”。首先,因为它是一种打字语言,其次是因为它不是一种引用类型(可以指向它)。您可以通过将枚举转换为整数(或枚举的支持类型)来存储列索引。在一天结束的时候,所有的枚举都是为你做的,给你一些数字值的别名,而cast可以让你得到那个潜在价值。
答案 1 :(得分:1)
这是一个结构性问题,因为您只使用枚举来为您的整数值指定可读名称。
让我们说现有的excel格式就像你说的那样:
Public Enum ColumnIndexEnum
FirstName = 1
LastName = 2
Address = 3
...
End Enum
现在你有了另一种excel格式,其中firstname是第2列,Title是第1列,如:
Public Enum ColumnIndexEnum2
Title = 1
FirstName = 2
LastName = 3
Address = 4
...
End Enum
所以是的,您可以根据需要创建新的枚举并使用它们。但是,我个人自己使用了EPPlus或CSVReader nuget包,因为我不必依赖特定的列顺序,我可以读取给定列名称的值。如果你没有列名,那就是另一个故事。
答案 2 :(得分:1)
你可以在这样的辅助函数中执行此操作:
Public Enum ColumnIndexEnum
FirstName = 1
LastName = 2
Address = 3
...
End Enum
Public Enum ColumnType
FirstType = 1
SecondType = 2
...
End Enum
Public Function GetColumn(ByVal col As ColumnIndexEnum, ByVal colType As ColumnType) As Integer
Select Case col
Case ColumnIndexEnum.FirstName
If colType = ColumnType.FirstType Then
Return 1
ElseIf colType = ColumnType.SecondType Then
Return 2
End If
Case ColumnIndexEnum.SecondName
If colType = ColumnType.FirstType Then
Return 2
ElseIf colType = ColumnType.SecondType Then
Return 3
End If
...
End Select
End Function
然后你可以这样使用它:
Dim row = 1
WorkSheet.GetValue(GetColumn(ColumnIndexEnum.FirstName,ColumnType.FirstType), row)
答案 3 :(得分:0)
从这里开始
Public Enum ColumnIndexEnum
FirstName = 1
LastName = 2
Address = 3
End Enum
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim row = 1
WorkSheet.GetValue(ColumnIndexEnum.FirstName, row)
End Sub
Step1-更改枚举的名称。 (使用红色下划线更改所有名称)
Public Enum ColumnIndexGetter
FirstName = 1
LastName = 2
Address = 3
End Enum
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim row = 1
WorkSheet.GetValue(ColumnIndexGetter.FirstName, row)
End Sub
Step2 - 摆脱枚举
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim row = 1
WorkSheet.GetValue(ColumnIndexGetter.FirstName, row)
End Sub
Step3 - 定义新变量
Private ColumnIndexGetter As Cases
和案例类。你需要修改它以适应实际情况,希望你能得到这个想法。
Public Class Cases
Private Enum ColumnIndexCase1
FirstName = 1
LastName = 2
Address = 3
End Enum
Private Enum ColumnIndexCase2
FirstName = 2
LastName = 3
Address = 7
End Enum
Private _whCase As Integer
Public Sub New(WhichCase As Integer)
Me._whCase = WhichCase
End Sub
Public Function FirstName() As Integer
Dim rv As Integer = 0
Select Case Me._whCase
Case 1
rv = ColumnIndexCase1.FirstName
Case 2
rv = ColumnIndexCase2.FirstName
End Select
Return rv
End Function
Public Function LastName() As Integer
Dim rv As Integer = 0
Select Case Me._whCase
Case 1
rv = ColumnIndexCase1.LastName
Case 2
rv = ColumnIndexCase2.LastName
End Select
Return rv
End Function
Public Function Address() As Integer
Dim rv As Integer = 0
Select Case Me._whCase
Case 1
rv = ColumnIndexCase1.Address
Case 2
rv = ColumnIndexCase2.Address
End Select
Return rv
End Function
End Class
最后,在使用ColumnIndexGetter之前,您需要
ColumnIndexGetter = New Cases(1)
'or
ColumnIndexGetter = New Cases(2)
然后代码看起来像
Private ColumnIndexGetter As Cases
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
ColumnIndexGetter = New Cases(1)
'or
ColumnIndexGetter = New Cases(2)
Dim row = 1
WorkSheet.GetValue(ColumnIndexGetter.FirstName, row)
End Sub
ColumnIndexGetter初始化的实际位置可能就是您知道要处理的是哪种情况。