【问题标题】:Unit Converter C# [closed]单位转换器 C# [关闭]
【发布时间】:2012-12-23 23:55:31
【问题描述】:

我今天无事可做,所以我决定尝试创建一个简单的单位转换器。到目前为止,它运行良好,但由于我使用了这么多“if”语句,它花费的时间太长了。我在网上搜索了用 Visual Studio 制作的单位转换器的示例,但我发现的唯一一个是用 VS Basic 制作的货币转换器,它使用在线转换器进行计算。那么有没有更快的方法来创建单位转换器?

public partial class Form1 : Form
{

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (listBox1.SelectedItem == listBox2.SelectedItem) 
        {
            txtAns.Text = txtFirstUnit.Text;
        }

        if (listBox1.SelectedItem == "Feet" && listBox2.SelectedItem == "Inches") 
        {

            txtAns.Text = (double.Parse(txtFirstUnit.Text) * 12).ToString();
        }

        if (listBox1.SelectedItem == "Inches" && listBox2.SelectedItem == "Feet")
        {

            txtAns.Text = (double.Parse(txtFirstUnit.Text) / 12).ToString();
        }

        if (listBox1.SelectedItem == "Yard" && listBox2.SelectedItem == "Feet")
        {

            txtAns.Text = (double.Parse(txtFirstUnit.Text) * 3).ToString();
        }

        if (listBox1.SelectedItem == "Feet" && listBox2.SelectedItem == "Yard")
        {

            txtAns.Text = (double.Parse(txtFirstUnit.Text) / 3).ToString();
        }

        if (listBox1.SelectedItem == "Yard" && listBox2.SelectedItem == "Inches")
        {

            txtAns.Text = (double.Parse(txtFirstUnit.Text) * 36).ToString();
        }

        if (listBox1.SelectedItem == "Inches" && listBox2.SelectedItem == "Yard")
        {

            txtAns.Text = (double.Parse(txtFirstUnit.Text) / 36).ToString();
        }

        if (listBox1.SelectedItem == "Mile" && listBox2.SelectedItem == "Inches")
        {

            txtAns.Text = (double.Parse(txtFirstUnit.Text) * 63360).ToString();
        }

        if (listBox1.SelectedItem == "Inches" && listBox2.SelectedItem == "Mile")
        {

            txtAns.Text = (double.Parse(txtFirstUnit.Text) / 63360).ToString();
        }

        if (listBox1.SelectedItem == "Mile" && listBox2.SelectedItem == "Feet")
        {

            txtAns.Text = (double.Parse(txtFirstUnit.Text) * 5280).ToString();
        }

        if (listBox1.SelectedItem == "Feet" && listBox2.SelectedItem == "Mile")
        {

            txtAns.Text = (double.Parse(txtFirstUnit.Text) / 5280).ToString();
        }

        if (listBox1.SelectedItem == "Mile" && listBox2.SelectedItem == "Yard")
        {

            txtAns.Text = (double.Parse(txtFirstUnit.Text) * 1760).ToString();
        }

        if (listBox1.SelectedItem == "Yard" && listBox2.SelectedItem == "Mile")
        {

            txtAns.Text = (double.Parse(txtFirstUnit.Text) / 1760).ToString();
        }

        if (listBox1.SelectedItem == "Inches" && listBox2.SelectedItem == "Meters")
        {

            txtAns.Text = (double.Parse(txtFirstUnit.Text) / 39.370).ToString();
        }

        if (listBox1.SelectedItem == "Meters" && listBox2.SelectedItem == "Inches")
        {

            txtAns.Text = (double.Parse(txtFirstUnit.Text) * 39.370).ToString();
        }

        if (listBox1.SelectedItem == "Meters" && listBox2.SelectedItem == "Feet")
        {

            txtAns.Text = (double.Parse(txtFirstUnit.Text) * 3.2808).ToString();
        }

        if (listBox1.SelectedItem == "Feet" && listBox2.SelectedItem == "Meters")
        {

            txtAns.Text = (double.Parse(txtFirstUnit.Text) / 3.2808).ToString();
        }

        if (listBox1.SelectedItem == "Meters" && listBox2.SelectedItem == "Yard")
        {

            txtAns.Text = (double.Parse(txtFirstUnit.Text) * 1.0936).ToString();
        }

        if (listBox1.SelectedItem == "Yard" && listBox2.SelectedItem == "Meters")
        {

            txtAns.Text = (double.Parse(txtFirstUnit.Text) / 1.0936).ToString();
        }

        if (listBox1.SelectedItem == "Meters" && listBox2.SelectedItem == "Miles")
        {

            txtAns.Text = (double.Parse(txtFirstUnit.Text) * 0.00062137).ToString();
        }

        if (listBox1.SelectedItem == "Miles" && listBox2.SelectedItem == "Meters")
        {

            txtAns.Text = (double.Parse(txtFirstUnit.Text) / 0.00062137).ToString();
        }
    }
}

【问题讨论】:

标签: c# .net winforms unit-conversion


【解决方案1】:

面向对象的方法将摆脱if (lst.SelectedItem) == 语句。

考虑这个代码,它对每个单元都有不同的类。找不到 if 语句。

  public Form1()
  {
     InitializeComponent();

     fromList.Items.Add(new CentimeterFromMillimeterConverter());
     toList.Items.Add(new CentimeterToMillimeterConverter());
  }

  void Convert(double amount)
  {
     var from = (FromMillimeterConverter) fromList.SelectedItem;
     var to = (FromMillimeterConverter) toList.SelectedItem;
     to.Convert(from.Convert(amount));
  }

public abstract class ToMillimeterConverter
{
  public abstract double Convert(double unit);
  public override string ToString()
  {
     return GetType().Name.Replace("ToMillimeterConverter", "");
  }
}

public class CentimeterToMillimeterConverter : ToMillimeterConverter
{
  public override double Convert(double centimeters)
  {
     return 10 * centimeters;
  }
}

public abstract class FromMillimeterConverter
{
  public abstract double Convert(double unit);
  public override string ToString()
  {
     return GetType().Name.Replace("FromMillimeterConverter", "");
  }
}

public class CentimeterFromMillimeterConverter : FromMillimeterConverter
{
  public override double Convert(double centimeters)
  {
     return centimeters / 10;
  }
}

【讨论】:

  • 谢谢。我在非常基本的层面上查看我的问题,但如果我想精通 C#,我必须使用一些更高级的技术。我通常会尝试采取最简单的方法,但大多数时候它太耗时了。
  • 祝你好运。 if/switch 声明通常很麻烦,除非您确定不会再有另一个 else/case。我希望这能给你一些新的想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-24
  • 2012-06-04
  • 1970-01-01
  • 1970-01-01
  • 2012-05-27
  • 2010-09-14
  • 1970-01-01
相关资源
最近更新 更多