2016-05-17 6 views
0

最近C#に入りましたが、私はStacksについて少し勉強しようとしていました。スタックをソートしようとしましたが、最初に配列に変換していましたが、奇妙なエラーがありました。ここでC#スタックを配列に変換してソートする

は私のコードです:

using System; 
using System.Collections.Generic; 

class Program 
{ 
    public static Stack<int> numbers = new Stack<int>(); 
    static void Main(string[] args) 
    { 
     string[] input = Console.ReadLine().Split(' '); 

     int n = int.Parse(input[0]); 
     int s = int.Parse(input[1]); 
     int x = int.Parse(input[2]); 

     input = Console.ReadLine().Split(' '); 
     for (int i = 0; i < n; i++) 
     { 
      numbers.Push(int.Parse(input[i])); 
     } 

     for (int i = 0; i < s; i++) 
     { 
      numbers.Pop(); 
     } 

     if (numbers.Count == 0) 
      Console.WriteLine(0); 
     else if (numbers.Contains(x)) 
      Console.WriteLine("true"); 
     else 
      Console.WriteLine(Array.Sort(numbers.ToArray())); 


    } 
} 

私の問題は、私のコードの最後の他の部分(最後の行)である:

引数1:BOOL」に「無効」から変換することはできません「

なぜこれが起こっているときArray.Sort()私は、思っていた新しいARRAを返すべき、パラメータとして配列を必要とし、私はnumber.ToArray()を渡しますy 番号スタックのうちy。

+3

スタックをソートしないでください。スタック全体の目的を損なう。 –

+0

'void'メソッドは何も返しません。そのため、メソッドとして引数として使用することはできません。次の問題:配列全体を 'Console.WriteLine'することはできません。それを列挙するか、 'String.Join("、 "、numbers)'を使う必要があります。 –

+0

'Array.Sort'は何も返しません。配列をインプレースでソートします。 –

答えて

7

エラーは事実によりのArray.sort戻り無効なく期待配列を表示されます。


はさらに
、Console.WriteLineをコンソールに入力し、印刷し、それを取得し、それが配列を取得し、その配列を印刷しないことができ、それだけであなたの実際の配列のアドレスを出力します。

配列(または任意のコレクション)を印刷するには、コレクションを受け取り、区切り文字で区切られた文字列を返すstring.Joinを使用する必要があります。

非常に簡単使用System.Linq.OrderBy

numbers.OrderBy(num => num).ToArray(); 

例:

public static void Main() 
{ 
    var numbers = new Stack<int>(); 
    numbers.Push(4); 
    numbers.Push(1); 
    numbers.Push(2); 

    var numbersSorted = numbers.OrderBy(num => num).ToArray(); 
    Console.WriteLine(string.Join(", ", numbersSorted)); 
} 

出力: 1、2、4

DotNetFiddle

+0

これには、スタックをそのまま残すという利点があります。 –

2

Array.Sortは、配列のインプレースソートを実行します。新しいソートされた配列は返されません。したがって、Void関数です。

コードを変更してください。

int[] numberArray = numbers.ToArray(); 
numberArray.Sort(); 
Console.WriteLine(numberArray); 
+0

'Console.WriteLine(numberArray)'は役に立ちません –

+0

同意しましたが、OPが照会していたものではありません。 – PhillipH

+0

いいえ、次の問題があります。 'Console.WriteLine(string.Join("、 "、numberArray));'それを修正します –

1

エラーメッセージは明らかです。この行では:

Console.WriteLine(Array.Sort(numbers.ToArray())); 

Array.Sortは何も(ボイド)返しませんが、あなたは、パラメータを期待Console.WriteLineに渡しています。

あなたはこれで他の最後に置き換える必要があります。

var numbersArray = numbers.ToArray(); 
Array.Sort(numbersArray); 

Console.WriteLine(string.Join(",", numbers)); 
1

並べ替えの前に配列変数を割り当てる必要があります。

else 
    { 
     var array = numbers.ToArray(); 
     Array.Sort(array); 
     Console.WriteLine(array); 

    } 
2

Array.Sort二つの異なる文の中で、あなたが(コンソールに)Sortと書き込みを分離するためにきた、無効方法です。

私は、OrderBy linq拡張とstring.Joinを一緒に使用して1つのライナー表示をすることをお勧めします。

Console.WriteLine(string.Join(",", numbers.OrderBy(x=>x)); 
1

最初にArrayオブジェクトに変換します。配列を並べ替えると、配列を印刷するのに

Console.WriteLine(array)を使用する必要があります。

int[] numberArray = numbers.ToArray(); //change to Array. 
    numberArray.sort();     // it will sort your Array. 
    Console.WriteLine(numberArray); //display the sorted Array. 

代わりの

Console.WriteLine(Array.Sort(numbers.ToArray())); // here whatever Sort() method return will be printed as Output but infact Sort() returns void. 

だからあなたはError: cannot convert from 'void' to 'bool'

0

を取得するコンパイル時の応答のためのみんなに感謝します。私はJavaから来ています。ここでコレクションを直接印刷することができます。そのように私はそれをやってみました。

関連する問題