如何在for循环中使用switch case?

How to use switch case in for loop?

我有一个菜单,其中包含以下项目:

Orange
Apple
Lemon
Banana

每个项目都有自己的 Uid,例如1 是 Orange,2 是 Apple 等。当从菜单中单击 "Apple" 时,将弹出一个消息框并显示 "Apple is chosen"。我知道这可以通过使用 switch case 来完成,但我不想逐案处理,而是想让它更灵活。例如:

MenuItem menuItem=(MenuItem)e.OriginalSource;
int itemUid=Int32.Parse(menuItem.Uid);

for (itemUid = 1; itemUid <= menuItem.Items.Count; itemUid++)
{
  switch (itemUid)
  {
    case itemUid: Console.WriteLine("{0} is chosen", menuItem.Header); break;
  }
}

问题出在case语句中,它只能接受常量。

有什么解决这个问题的建议吗?

switch 只支持常量作为 case 中的值。来自 specs:

switch-label:
case   constant-expression   :

改用 if 语句。

Switch 语句在编译时求值。你不能在你的情况下使用开关。你可能想要做一个 if else ,或者直接使用你的枚举

假设你的菜单

<Menu MenuItem.Click="CommonHandler">

  <MenuItem Header="Orange" Name="Orange"/>

  <MenuItem Header="Apple" Name="Apple"/>

  <MenuItem Header="Lemon" Name="Lemon"/>

  <MenuItem Header="Banana" Name="Banana"/>

</Menu>

在您的点击处理程序中

像这样尝试

void CommonHandler(object sender, RoutedEventArgs e) {
MenuItem mi = e.Source as MenuItem;

  switch (mi.Name) {

    case "Orange":  //do something;

      break; 

    case "Apple":  //do something else

      break; 

    case "Lemon":  //something else again

      break; 
    case "Banana":  //something else again

      break; 

  }
}

我不太确定你在问什么,但经过一番思考后,我相信你想要 switch-case 带来的相同功能,只是代码重复更少。

在那种情况下,我认为像这样的方法可以解决问题:

var message = string.Format("{0} is selected.", ((MenuItem) e.Source).Header);
// Do something with message