c#将选择案例VBA转换为c#SWITCH

时间:2011-01-05 20:29:24

标签: c# vba

我有一些我需要转换为c#

的vba代码
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,但有更简单的方法吗?

我不会检查CELLS(rownum.........)而不是switch(somestring)

有没有比明确写每个案例更简单的方法呢?

6 个答案:

答案 0 :(得分: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格式 - 不包括验证!

编辑我猜这个算法现在有点清楚......

答案 1 :(得分:1)

这两个片段是等效的。这是否回答了你的问题?

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

Cells[rownum, 2].Value = result;

这相当于:

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;

如果你想使用switch语句,你可以做前者。但是,开关更干净,效率更高,所以我肯定会使用它。

答案 2 :(得分: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";

请记住,这只是伪代码,尚未经过测试。它仅用于显示目的。希望你明白了。

答案 3 :(得分: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获取价值时,您只需致电:

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

答案 4 :(得分: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];

答案 5 :(得分: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;
  }

这与rsen娜发布的相似。