陷入困境

sar*_*012 1 c#

while (true)
{
    //read in the file
    StreamReader convert = new StreamReader("../../convert.txt");

    //define variables
    string line = convert.ReadLine();
    double conversion;
    int numberIn;
    double conversionFactor;

    //ask for the conversion information
    Console.WriteLine("Enter the conversion in the form (Amount, Convert from, Convert to)");
    String inputMeasurement = Console.ReadLine();
    string[] inputMeasurementArray = inputMeasurement.Split(',');


    //loop through the lines looking for a match
    while (line != null)
    {
        string[] fileMeasurementArray = line.Split(',');
        if (fileMeasurementArray[0] == inputMeasurementArray[1])
        {
            if (fileMeasurementArray[1] == inputMeasurementArray[2])
            {
                Console.WriteLine("The conversion factor for {0} to {1} is {2}", inputMeasurementArray[1], inputMeasurementArray[2], fileMeasurementArray[2]);

                //convert to int
                numberIn = Convert.ToInt32(inputMeasurementArray[0]);
                conversionFactor = Convert.ToDouble(fileMeasurementArray[2]);

                conversion = (numberIn * conversionFactor);
                Console.WriteLine("{0} {1} is {2} {3} \n", inputMeasurementArray[0], inputMeasurementArray[1], conversion, inputMeasurementArray[2]);
                break;
            }
        }
        else
        {
            Console.WriteLine("Please enter two valid conversion types \n");
            break;
        }
        line = convert.ReadLine();
    }
}
Run Code Online (Sandbox Code Playgroud)

该文件包含以下内容:

ounce,gram,28.0
pound,ounce,16.0
pound,kilogram,0.454
pint,litre,0.568
inch,centimetre,2.5
mile,inch,63360.0
Run Code Online (Sandbox Code Playgroud)

用户将输入类似6盎司,克的东西

这个想法是通过检查文件中的第一个和第二个单词是否与用户输入的第二个和第三个单词相同来找到正确的行.

问题是如果它检查第一行并且它失败了if语句,如果进入else语句并停止.我试图找到一种方法,它会在它找到正确的行之后停止但不是直到.如果有人键入了不在文件中的值,则应显示错误.

tva*_*son 5

删除else子句中的break语句.这导致它退出循环.

您可以通过将转换因子读入内部数据结构来改进此代码,也许是由"from"转换单元键入的字典,其值为可能的输出单位及其转换因子的字典 - 或自定义键/值如果你只有一个可能的输出单位对.这会将您的内部循环变为两阶段查找(更快),并且每次都必须重新读取转换文件.正如@Ben指出的那样,错误信息也在错误的位置.它需要在循环/查找之外,并且仅在未找到匹配时才执行.

示例代码 - 请注意此代码中没有输入验证:

var conversions = new Dictionary<string,Dictionary<string,double>>();
var convert = new StreamReader("../../convert.txt");
while ((var line = convert.ReadLine()) != null)
{
    string components = line.Split(',');
    Dictionary<string,double> unitConversions;
    if (conversions.ContainsKey( components[0] ))
    {
        unitConversions = conversions[components[0]];
    }
    else
    {
        unitConversions = new Dictionary<string,double>();
        conversions.Add( components[0], unitConversions );
    }
    unitConversions.Add( components[1], Convert.ToDouble( components[2] ) );
}

while (true)
{
    //ask for the conversion information     
    Console.WriteLine("Enter the conversion in the form (Amount, Convert from, Convert to)");     
    var inputMeasurement = Console.ReadLine();     
    var inputMeasurementArray = inputMeasurement.Split(',');

    bool converted = false;
    Dictionary<string,double> unitConversion;
    if (conversions.TryGetValue(  inputMeasurementArray[1], out unitConversion ))
    {
         double conversionFactor;
         if (unitConversion.TryGetValue( inputMeasurementArray[2], out conversionFactor ))
         {
             converted = true;
             conversion = Convert.ToDouble( inputMeasurementArray[0] ) * conversionFactor;
             Console.WriteLine("{0} {1} is {2} {3} \n", inputMeasurementArray[0], inputMeasurementArray[1], conversion, inputMeasurementArray[2]);              
         }
    }

    if (!converted)
    {
         Console.WriteLine("Please enter two valid conversion types\n");
    }
}
Run Code Online (Sandbox Code Playgroud)