2012-03-22 22 views
-1
using (read = new StreamReader("C:/Users/Sam Smith/Desktop/convert.txt")) 
      { 
       while (!read.EndOfStream) 
       { 
        lineFromFile = read.ReadLine(); 
        units = lineFromFile.Split(','); 

        if (units.Contains(splitEntry[0]) && units.Contains(splitEntry[1])) 
        { 
         firstUnit = units[0]; 
         secondUnit = units[1]; 
         userConvertValue = Convert.ToDouble(splitEntry[2]); 
         fileConvertValue = Convert.ToDouble(units[2]); 
         result = fileConvertValue * userConvertValue; 
        } 
        if (units.Contains(splitEntry[0]) && units.Contains(splitEntry[1])) 
        { 
         firstUnit = units[1]; 
         secondUnit = units[0]; 
         userConvertValue = Convert.ToDouble(splitEntry[2]); 
         fileConvertValue = Convert.ToDouble(units[2]); 
         result = userConvertValue/fileConvertValue; 
        } 
        if (!units.Contains(splitEntry[0]) || !units.Contains(splitEntry[1])) 
        { 
         Console.WriteLine("Error, measurement unit not recognised."); 
        } 

上記の私は単位測定の種類(ポンド、オンス、マイルなど)を含むテキストファイルを持っています。このファイルのテキストは文字列配列に分割されています。 単位、単位、量 テキストファイルでは、2単位の変換量は3番目の分割文字列ごとになります( 単位、2.80)。 ユニット、ユニット、1.27(など)配列と測定単位の変換

ユニットの各セットとその換算額をグループ化する方法はありますか?たとえば、ユーザーが2つの特定の単位を変換しようとすると、プログラムは最終結果を計算するときに使用する変換値を認識します。 少し曖昧かもしれませんが、説明するのは難しいです。 EDIT:ユーザーはファイルとやり取りしません。プログラムはファイルからデータを取り出し、文字列( '、')に分割して配列に格納します。私は間違ってあなたを持っていない場合は

+0

-1:残念ながら、非常に曖昧です。「テキストファイル」があり、「ユーザーが入力しました」ということを助けません。ユーザーはテキストファイルに物事を入力しますか?あなたはテキストファイルのサンプルを提供することができます、なぜユーザーがそれらの値を入力して、どのようなプログラムがデータで何をすべきか教えてください。 –

+0

splitEntry配列の目的は何ですか?私はそれがこのスニペットの外で宣言されていると仮定します。 –

+0

'splitEntry'の目的は、ユーザーの入力を配列に分割することです。その配列の値は.contains()を使用して 'units'配列の値と照合されます。 –

答えて

0

、次のコードは、あなたの要件を満たす必要があります(これは非常に基本的ですが、ハンドリングエラーなど):

public enum Unit 
{ 
    Pound, 
    Kilo, 
    Kilometer, 
    Mile 
} 

public class UnitMapping 
{ 

    public UnitMapping(Unit source, Unit target, double factor) 
    { 
    SourceUnit = source; 
    TargetUnit = target; 
    Factor = factor; 
    } 

    public Unit SourceUnit { get; private set; } 

    public Unit TargetUnit { get; private set; } 

    public double Factor { get; private set; } 

} 

public class UnitCalculator 
{ 
    public const string FILE_INPUT = @"Kilo,Pound,0.45359237 
            Kilometer,Mile,1.609344"; 


    private List<UnitMapping> mappings; 

    public UnitCalculator() 
    { 
    this.mappings = new List<UnitMapping>(); 

    // parse the mappings 
    foreach (var line in FILE_INPUT.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries)) 
    { 
     var fields = line.Split(','); 

     var source = (Unit)Enum.Parse(typeof(Unit), fields[0]); 
     var target = (Unit)Enum.Parse(typeof(Unit), fields[1]); 
     double factor = double.Parse(fields[2], CultureInfo.InvariantCulture); 

     this.mappings.Add(new UnitMapping(source, target, factor)); 
    } 
    } 

    public double Convert(Unit source, Unit target, double value) 
    { 
    foreach (var mapping in this.mappings) 
    { 
     if (mapping.SourceUnit == source && mapping.TargetUnit == target) 
     { 
     return value * mapping.Factor; 
     } 
     else if (mapping.SourceUnit == target && mapping.TargetUnit == source) 
     { 
     return value * (1/mapping.Factor); 
     } 
    } 

    throw new InvalidOperationException("No mapping could be found for this conversion."); 
    } 

} 

はこのようにそれを起動していない:

static void Main(string[] args) 
{ 
    var calc = new UnitCalculator(); 
    Console.WriteLine(calc.Convert(Unit.Mile, Unit.Kilometer, 1)); 
} 

ユニットがわからない場合は、文字列も使用できます。

関連する問題