2017-07-30 32 views
1

私はこの練習をしています。私は問題が何であるか分かりませんが、私はエラーが発生し続けています - 誰かが間違っていることを教えてくれますか?intからcharにエラーを変換できません。C#

未処理の例外:System.InvalidCastException:型 'System.String []'のオブジェクトを型 'System.IConvertible'にキャストできません。
at System.Convert.ToInt32(オブジェクト値)
at exercise_4.Program.Main(String [] args)D:\ Courses \ C#\ beginner \ visual studio \ section 6エクササイズ\エクササイズ4 \エクササイズ4 \ Program .csファイル:行20

これは私のコンソールで書かれているもの

プログラムを書き、コンマのリストを提供するようにユーザーに依頼しているが(例えば、5、1、9、2、10)の数字を分離しました。リストが空であるか、5つ以下の数字が含まれている場合は、「無効なリスト」を表示して、ユーザーに再試行を依頼してください。それ以外の場合は、リストに3つの最小値を表示します。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace exercise_4 
{ 
    class Program 
    { 
    static void Main(string[] args) 
    { 
     while (true) 
     { 
     Console.WriteLine("write numbers seperated with coma"); 
     var numbers = new List<int>(); 
     var input = (Console.ReadLine()); 
     var value = input.Split(','); 
     var conv =Convert.ToInt32(value); 
     numbers.Add(conv); 

     if (value.Length < 5) 
     { 
      Console.WriteLine("invalid list!! retry"); 
      continue; 
     } 
     else 
     { 
      numbers.Sort(); 
      Console.WriteLine(numbers[0] , numbers[1], numbers [2]); 
     } 
     } 
    } 
    } 
} 

お返事ありがとうございます。

+3

Splitは配列を返します。配列をnumに変換することはできません。それぞれの数値をintに変換して変換する必要があるかもしれません。 – Kajal

+2

Splitは文字列の配列を返します。つまり、valueは配列です。文字列の配列です。 ToInt32は、文字列(または一般的にはIConvertibleインターフェイスを実装する任意の型)が動作することを期待しています。値をループして各単一のエントリを変換し、これをあなたの番号リストに追加する必要があります。 – ckuri

答えて

2

Splitメソッドは、文字列の配列を返します。次の文は、文字列[] intへのキャストしようとするため、例外がスローされます。

var conv =Convert.ToInt32(value); 

次のように、配列内の各項目を反復処理し、解析する必要があります。

while (true) 
     { 
      Console.WriteLine("write numbers seperated with coma"); 
      List<int> numbers = new List<int>(); 
      var input = (Console.ReadLine()); 
      var values = input.Split(','); 

      foreach (var value in values) 
      { 
       int number; 

       // If the input can be parsed to int, add it to numbers list. 
       if (int.TryParse(value, out number)) 
       { 
        numbers.Add(number); 
       } 
      } 

      if (numbers.Count < 5) 
      { 
       Console.WriteLine("invalid list!! retry"); 
       continue; 
      } 
      else 
      { 
       numbers.Sort(); 
       numbers.Take(3) 
         .ToList() 
         .ForEach(number => Console.WriteLine(number)); 
      } 
     } 
+0

私は正しく理解しています:メソッドint.TryParse値を文字列からintに変換しますか?実際には同じことが正しいのですか? – Comp

+0

はい、ここでint.TryParseについて読む:https://msdn.microsoft.com/en-us/library/f02979c7(v=vs.110).aspxリストの最初の3つの数字を印刷する答えを変更しました。 – ashin

2

あなたはこれを置き換えることができます。これに

var values = input.Split(','); 

var values = input.Split(',').Select(a => int.Parse(a)).OrderBy(a => a).Take(3); 

3つの小さい数字が表示されます。

関連する問題