我有一些我需要转换为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)
有没有比明确写每个案例更简单的方法呢?
答案 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娜发布的相似。