2017-04-18 13 views
-3

私はユーザーからの入力を取得し、配列に変換してソートしてユーザーに表示するコンソールアプリケーションを作成しています。問題は、数字の半分を取り上げて並べ替えるように見えるだけだということです。また、 "End"入力を取得しない場合もあります。その結果、アプリケーションが失敗します。なぜこれが起こるのですか?c#コンソール入力配列のソート

static void Main(string[] args) 
    { 

     List<Int64> userInts = new List<Int64>(); 
     for (int i = 0; i < 99; i++) 
     { 
      string userValue = Console.ReadLine(); 

      int userInt; 
      if (int.TryParse(userValue, out userInt)) 
      { 
       userInts.Add(userInt); 
       if (Console.ReadLine().Contains("End")) 
       { 
        break; 
       } 
      } 

     } 
     Int64[] Numbers = userInts.ToArray(); 
     var intList = new List<Int64>(); 
     intList.AddRange(Numbers); 
     Console.WriteLine("De originele opsteling van nummers:"); 
     foreach (Int64 numb in intList) 
      Console.Write(" {0}", numb); 
     Console.WriteLine(Environment.NewLine); 
     intList.Sort(); 
     Console.WriteLine("Lijst in gesorteerde ordening: "); 
     foreach (Int64 numb in intList) 
      Console.Write(" {0}", numb); 
     Console.WriteLine(); 
     Console.ReadKey(); 
    } 
} 

}

+0

TryParseは、falseを返します:あなたは1 :)

これを試してみてくださいを使用することができます。 – Berkay

答えて

2

は、Endを探している他のすべての行を無視し、入力された値を処理することができるように、ネストされたifブロックの外に移動します。

List<Int64> userInts = new List<Int64>(); 
for (int i = 0; i < 99; i++) 
{ 
    string userValue = Console.ReadLine(); 
    if (userValue.Contains("End")) 
    { 
     break; 
    } 

    int userInt; 
    if (int.TryParse(userValue, out userInt)) 
    { 
     userInts.Add(userInt); 
    } 
} 

また、あなたはあなたのリストを並べ替えるコードの2番目のブロックは、簡素化することができます。

Console.WriteLine("De originele opsteling van nummers:"); 
Console.Write(string.Join(" ", userInts)); 
Console.WriteLine(); 
userInts.Sort(); 
Console.WriteLine("Lijst in gesorteerde ordening:"); 
Console.Write(string.Join(" ", userInts)); 
Console.WriteLine(); 
Console.ReadKey(); 
  • あなただけの値の文字列を作成するために、あなたはすでに
  • 使用string.Joinを持ってuserInts変数を使用する代わりに
  • が通過する必要はありませんループし、複数のアレイまたはリストを必要としませんEnvironment.NewLineConsole.WriteLine()
0

あなたはループの中で2回読み込んでいます - 入力は2回ごとにしか取得されません。 rを最初のReadLineまたは2番目のReadLineに追加し、記述した動作を引き起こします。

このような何かが動作するはず

for (int i = 0; i < 99; i++) 
    { 
     string userValue = Console.ReadLine(); 
     if (userValue.Contains("End")) 
      { 
       break; 
      } 
     int userInt; 
     if (int.TryParse(userValue, out userInt)) 
     { 
      userInts.Add(userInt); 
     } 
    } 
0
if (Console.ReadLine().Contains("End")) 
{ 
    break; 
} 

これは、行を読み込みます。それが "終了"の場合、プログラムを停止しますが、整数の場合は破棄されます。

TryParseの条件と同じ理由で、以前に解析された整数がある場合にのみプログラムを終了します。

0

なぜあなたは非常に多くのリストを使用していますか?終了が整数に変換することができないので、

List<long> userInts = new List<long>(); 
for (int i = 0; i < 99; i++) 
{ 
    string userValue = Console.ReadLine(); 

    if (userValue.Contains("End")) 
     break; 

    int userInt; 

    if (int.TryParse(userValue, out userInt)) 
     userInts.Add(userInt); 

} 

// Print the unchanged numbers 
Console.WriteLine("De originele opsteling van nummers:"); 
foreach (long numb in userInts) 
    Console.Write(" {0}", numb); 

Console.WriteLine(Environment.NewLine); 
// Sorts the List 
userInts.Sort(); 

// Output the sorted list 
Console.WriteLine("Lijst in gesorteerde ordening: "); 
foreach (long numb in userInts) 
    Console.Write(" {0}", numb); 

Console.WriteLine(); 
Console.ReadKey();