C# - преобразовать оператор Switch в If-Else - PullRequest
0 голосов
/ 08 февраля 2020

У меня немного проблемы с выполнением этого конкретного задания. Взять оператор switch и преобразовать его в if-else. Эта программа использует список для выбора местоположения и отображения соответствующего часового пояса.

if (cityListBox.SelectedIndex != -1)
        {
            //Get the selected item.
            city = cityListBox.SelectedItem.ToString();

            // Determine the time zone.
            switch (city)
            {
                case "Honolulu":
                    timeZoneLabel.Text = "Hawaii-Aleutian";
                    break;
                case "San Francisco":
                    timeZoneLabel.Text = "Pacific";
                    break;
                case "Denver":
                    timeZoneLabel.Text = "Mountain";
                    break;
                case "Minneapolis":
                    timeZoneLabel.Text = "Central";
                    break;
                case "New York":
                    timeZoneLabel.Text = "Eastern";
                    break;
            }
        }
        else
        {
            // No city was selected.
            MessageBox.Show("Select a city.");

Ответы [ 3 ]

3 голосов
/ 08 февраля 2020

При таком подходе вы можете избавиться от switch или if-else операторов

Создать класс для представления часовых поясов

public class MyTimezone
{
    public string City { get; set; }
    public string Name { get; set; }
}

Создать список часовых поясов и связать его с listbox

var timezones = new[]
{
    new MyTimezone { City = "Honolulu", Name = "Hawaii-Aleutian" },
    new MyTimezone { City = "San Francisco", Name = "Pacific" },
    // and so on...
}   

cityListBox.DisplayMember = "City";
cityListBox.ValueMember = "Name"; 
cityListBox.DataSource = timezones;

Затем в коде, где вы хотите использовать выбранные часовые пояса

var selected = (MyTimeZone)cityListBox.SelectedItem;
timeZoneLabel.Text = selected.Name;

Поскольку свойство Name используется как ValueMember, вы можете использовать свойство SelectedValue.

// SelectedValue can bu null if nothing selected
timeZoneLabel.Text = cityListBox.SelectedValue.ToString();
1 голос
/ 08 февраля 2020

Я предлагаю превратить switch в Dictionary<string, string>, то есть отдельные данные (город и его часовой пояс) и представление (Label, ListBox et c .):

private static Dictionary<string, string> s_TimeZones = new Dictionary<string, string>() {
  {"Honolulu", "Hawaii-Aleutian"},
  {"San Francisco", "Pacific"},
  //TODO: add all the pairs City - TimeZone here
};

, затем вы можете использовать его следующим образом (два if с):

if (cityListBox.SelectedIndex >= 0) {
  if (s_TimeZones.TryGetValue(cityListBox.SelectedItem.ToString(), out string tz))
    timeZoneLabel.Text = tz;
  else 
    timeZoneLabel.Text = "Unknown City";
} 
else {
  // No city was selected.
  MessageBox.Show("Select a city.");
  ...
1 голос
/ 08 февраля 2020

Таким образом, в большинстве языков программирования оператор switch и оператор if-else - это почти одно и то же (вообще говоря; переключение может быть быстрее на определенных компиляторах для определенных языков, и я не уверен насчет C# в частности). Switch является более или менее синтактическим c сахаром по сравнению с if-else. В любом случае, оператор if-else, соответствующий вашему переключателю, будет выглядеть примерно так:

if (city == "Honolulu") {
    timeZoneLabel.Text = "Hawaii-Aleutian";
} else if (city == "San Francisco") {
    timeZoneLabel.Text = "Pacific";
} else if (city == "Denver") {
    timeZoneLabel.Text = "Mountain";
}
... etc

Имеет ли это смысл?

...