2012-12-23 33 views
3

今天我没有别的事要做,所以我决定尝试创建一个简单的单位转换器。到目前为止,它运行良好,但由于我使用了如此多的'if'语句,因此它耗时太长。我已经在Visual Studio中搜索了“网络转换器”的示例,但唯一发现的是VS Basic中使用在线转换器进行计算的货币转换器。那么有没有更快的方法来创建单位转换器?单位转换器C#

enter image description here

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(); 
     } 
    } 
} 
+1

“有没有更快的方法来创建单位转换器?” - 是的,这就是所谓的查找表... –

+1

我知道这不是一个生产系统,或者你必须向公众发布的东西,但你一定要检查你的输入,以确保它们是理智的。 –

+0

[如何在C#中为度量单位创建通用转换器?](http://stackoverflow.com/questions/7851448/how-do-i-create-a-generic-converter-for-units -of-measurement-in-c) –

回答

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; 
    } 
} 
+1

谢谢。我在非常基础的层面上查看了我的问题,但如果我想熟练掌握C#,则必须使用一些更高级的技术。我通常会尽量采取最简单的方式,但大部分时间太耗时。 – pcnThird

+0

祝你好运。 'if/switch'语句通常很麻烦,除非你确定不会有别的'else/case'。我希望这给你一些新的想法。 –