2011-01-05 56 views
0

我有我需要轉換爲C#C#轉換選擇的情況下VBA到C#開關

Select Case letter0 
    Case "A01" 
    Cells(rownum, 2).Value = "1" 
    Case "B01" 
    Cells(rownum, 2).Value = "2" 
    Case "C01" 
    Cells(rownum, 2).Value = "3" 
    Case "D01" 
    Cells(rownum, 2).Value = "4" 
    Case "E01" 
    Cells(rownum, 2).Value = "5" 
    Case "F01" 
    Cells(rownum, 2).Value = "6" 
    Case "G01" 
    Cells(rownum, 2).Value = "7" 
    Case "H01" 
    Cells(rownum, 2).Value = "8" 
    Case "A02" 
    Cells(rownum, 2).Value = "9" 
    Case "B02" 
... 
.. 

我知道如何做這個switch一些VBA代碼,但有更簡單的方法是什麼?

我不會被檢查,而不是CELLS(rownum.........)會做switch(somestring)

有更簡單的方法來做到這一點不是明確寫出每一個情況?

+0

你能展示一點點你的代碼嗎?如果該switch/case語句有大量不同的情況,那麼如果您設置的值在每種情況下都增加,則可能有更好的方法來執行此操作。也許顯示'letter0','rownum'以及聲明中最後幾個例子的類型。 – 2011-01-05 20:33:27

回答

2
public static string GetCellValue(string letter0) { 
    var line = Convert.ToInt32(letter0.Substring(1, 2)); 
    var column = Convert.ToInt32(letter0[0] - 'A' + 1); 
    var result = (line - 1) * 8 + column; 

    return Convert.ToString(result); 
} 

... 

Cells[rownum, 2].Value = GetCellValue(letter0);   

是的,它的工作原理(您例如至少)。當然,假設letter0始終爲A99格式 - 不包括驗證!

編輯我猜的算法現在是有點更清晰......

+0

爲什麼我不應該使用它 – 2011-01-05 20:52:03

+0

@herrow:嗯,我只是覺得它太「哈克」了。但讓我嘗試做得更好,只需一秒... – rsenna 2011-01-05 20:54:01

+0

大的改進。 ;) – 2011-01-06 00:11:20

0

您可以創建一個字典對象,然後根據該密鑰從字典中提取值。

var letterValues = new Dictionary<string, string>() 
letterValues["A01"] = "1" 
letterValues["B01"] = "2" 
letterValues["C01"] = "3" 
.... 

然後,只需檢查值存在,如果有的話,進行分配:

Cells(rownum, 2).Value = (letterValues.ContainsKey(letter0)) ? letterValues[letter0] : "default value"; 

請記住,這僅僅是僞代碼,並沒有經過測試。它僅用於顯示目的。希望你明白這個主意。

1

這兩個片段是等效的。這回答了你的問題了嗎?

string letter0 = "h01"; 
string result = 
    letter0 == "h05" ? "x" 
    : letter0 == "a03" ? "y" 
    : letter0 == "fff" ? "z" 
    : "6"; 

Cells[rownum, 2].Value = result; 

這相當於:如果你想使用switch語句

switch (letter0) 
{ 
    case "h05": result = "x"; break; 
    case "a03": result = "y"; break; 
    case "fff": result = "z"; break; 
    default: result = "6"; break; 
} 

Cells[rownum, 2].Value = result; 

,你可以做前者。但是,交換機更乾淨,更高效,所以我一定會使用它。

0

您可以更改邏輯這樣

聲明靜態變量:

private static Dictionary<string, int> _values = new Dictionary<string, int>(); 

,並創建一個你會在啓動時只有一次調用靜態方法:

public static void InitValues() 
{ 
    _values.Add("A01", 1); 
    _values.Add("B01", 2); 
    _values.Add("C01", 3); 
    _values.Add("D01", 4); 
    _values.Add("E01", 5); 
    _values.Add("F01", 6); 
    _values.Add("G01", 7); 
    _values.Add("H01", 8); 
    ... 
} 

這樣,所有值將被緩存。

然後,當你需要根據letter8你可以簡單地調用get值:

Cells(rownum, 2).Value = _values[letter0]; 
0

待您的更新,從我可以告訴,這將是一個更好的選擇。爲了設置一個值而不是包含超過10個案例,請將單元格標籤放在字典中。像這樣的:

// set the dimensions of the labels to generate 
var rowCount = 10; // set appropriate row count here 
var colCount = 8; 

// use LINQ to generate the cell labels. 
// make it static if dimensions are large 
// or would otherwise generate this once 
var cellLabels = (from r in Enumerable.Range(1, rowCount) 
        from c in Enumerable.Range('A', colCount) 
             .Select(Convert.ToChar) 
        // create the labels 
        select String.Format("{0}{1:d02}", c, r)) 
        // convert to a dictionary 
       .Select((Key, i) => new { Key, Value = i + 1 }) 
       .ToDictionary(p => p.Key, p => p.Value.ToString()); 

string letter0 = ...; 

        // assuming letter0 will be in the 
        // range of the generated cell labels 
var stringToSet = cellLabels[letter0]; 
0

如果模式是可重複的,你可以做這樣的事情,雖然我不會在生產代碼中使用它。我會使用spinon發佈的字典解決方案。

// Incase of case statement 
    Cells(rownum, 2).Value = GetValue(letter0); 

    public String GetValue(String letter0) 
    { 
    String result = String.Empty; 
    if (letter0.Length >= 3) 
    { 
     int row_letter_as_int = (int)letter0[0]; 
     int row_number = int.Parse(letter0.Substring(1)); 
     result = ((row_letter_as_int - 64) + (7 * (row_number - 1))).ToString(); 
    } 
    return result; 
    } 

這與rsenna發佈的內容類似。