2017-04-13 186 views
0

我有一個.NET項目,在該項目中,Excel被上傳並逐行轉換爲對象。這工作正常。變量指向一個枚舉或另一個枚舉?

我已經定義了一個枚舉創建Excel文件中的列及其列的索引,這是我需要從列

爲使獲得的價值之間的映射:

Public Enum ColumnIndexEnum 
     FirstName = 1 
     LastName = 2 
     Address = 3 
     ... 
End Enum 

這是使用這樣的:

Dim row = 1 
    WorkSheet.GetValue(ColumnIndexEnum.FirstName, row) 

我已經使用了枚舉過去,進入新的列(僞代碼)。我可以通過輸入一個新條目來編輯枚舉,並且不必更改任何讀取特定列的代碼。

現在我必須對某些列中的某些列會消失的情況進行更改,但會在其他情況下返回。換句話說:有時列FirstName將成爲第一列(索引1),在其他時候,它將成爲第二列。

而且我很茫然,如何才能做到最好。我正在考慮創建第二個枚舉並切換我使用的枚舉,但無法找到任何有關如何創建一個指向一個枚舉或另一個枚舉的變量的細節。

有沒有人有任何想法呢?我爲這個項目使用VB.NET

回答

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) 
+0

這就是我最終做的,所以謝謝!只是一件小事。在GetColumn方法中,我允許它接受一個字符串,這是該列的名稱(不是標題,只是我在後端使用的名稱)。它試圖根據使用Enum.TryParse的時間將其解析爲正確的枚舉。所以我的解決方案比你的解決方案短一點。 但是你的建議讓我走上了正軌,所以謝謝! –

1

你不能有一個「變量指向一個枚舉或另一個」。首先,因爲它是一種類型化的語言,其次,因爲它不是引用類型(可以指出)。您可以通過將枚舉強制轉換爲整數(或任何支持類型的枚舉)來存儲列索引。在一天結束時,這就是枚舉爲你所做的一切,給你一個數值的別名,並且允許你獲得這個底層數值。

1

這更多的是一個結構性問題,因爲您只使用枚舉來爲您的整數值指定一個可讀的名稱。

可以說現有的Excel格式是如你所說的那樣:

Public Enum ColumnIndexEnum 
    FirstName = 1 
    LastName = 2 
    Address = 3 
    ... 
End Enum 

,現在你有另一個Excel格式,其中姓名爲列2和標題爲第1列,如:

Public Enum ColumnIndexEnum2 
    Title = 1 
    FirstName = 2 
    LastName = 3 
    Address = 4 
    ... 
End Enum 

所以是的,你可以隨意創建新的枚舉並使用它們。但是,我個人使用EPPlus或CSVReader nuget包,因爲我不必依賴特定的列順序,而且我可以讀取給定列名稱的值。它的另一個故事,如果你沒有列名。

+0

我也使用EPPlus。我可以通過它的名稱閱讀專欄嗎?我不知道這個!你碰巧知道如何?大多數示例使用索引整數。 –

+0

是的,還有另一篇文章在SO上http://stackoverflow.com/questions/39958798/epplus-find-column-using-column-name – Digvijay

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 

第二步 - 擺脫枚舉

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Dim row = 1 
    WorkSheet.GetValue(ColumnIndexGetter.FirstName, row) 
End Sub 

的第三步 - 定義新的變量

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的初始化的實際位置可能將是你知道你在處理哪種情況。

相關問題