2016-05-17 17 views
0

Ich habe vor kurzem in C# und ich versuchte, etwas über Stacks zu lernen. Ich wollte versuchen, einen Stapel zu sortieren, indem ich ihn zuerst in ein Array umwandelte, aber ich bekam einen seltsamen Fehler.C# einen Stapel in ein Array konvertieren und sortieren

ist hier mein Code:

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())); 


    } 
} 

ist mein Problem am letzten anderen Teil meines Codes (letzte Zeile):

Argument 1: kann nicht von 'Leere' zu ‚Bool konvertieren '

ich habe mich gefragt, warum dies geschieht, wenn Array.Sort(), ein Array als Parameter erfordert, und ich pass number.ToArray(), die eine neue Arra zurückkehren sollte y aus den Zahlen Stack.

+3

Sie sollten keinen Stapel sortieren. Es untergräbt den gesamten Stack-Zweck. –

+0

'void' Methoden geben nichts zurück, so dass Sie es nicht in einer Methode als Argument verwenden können. Das nächste Problem: Sie können nicht 'Console.WriteLine' ein ganzes Array. Sie müssen es aufzählen oder 'String.Join (", ", numbers)' verwenden. –

+0

'Array.Sort' liefert nichts zurück. Es sortiert ein Array an Ort und Stelle. –

Antwort

7

Fehler erscheint aufgrund der Tatsache, Array.Sort kehrt Leere und nicht die erwartete Array.

Zusätzlich, bekommt Console.WriteLine Eingänge und druckt sie auf Konsole, es nicht kann Array erhalten und das Array drucken, es wird Sie nur die Adresse tatsächliche Array drucken.

Um ein Array (oder eine Sammlung) zu drucken, sollten Sie string.Join verwenden, das eine Auflistung übernimmt und eine durch Trennzeichen getrennte Zeichenfolge zurückgibt.

Ziemlich einfach unter Verwendung System.Linq.OrderBy

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

Beispiel:

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)); 
} 

Output: 1, 2, 4

DotNetFiddle

+0

Dies hat den zusätzlichen Vorteil, dass der Stapel unberührt bleibt. –

2

Array.Sort führt eine In-Place-Sortierung für das Array aus. Es gibt kein neues sortiertes Array zurück. Es ist daher eine Void-Funktion.

Ändern Sie Ihren Code;

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

'Console.WriteLine (numberArray)' ist nicht sinnvoll –

+0

Einverstanden - aber nicht, was das OP abgefragt hat. – PhillipH

+0

Nein, aber die nächste Ausgabe wird er haben. 'Console.WriteLine (string.Join (", ", numberArray));' behebt es –

1

Die Fehlermeldung ist ziemlich klar. In dieser Zeile:

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

Die Array.Sort nicht zurück etwas (void) aber du bist vorbei zu Console.WriteLine, die einen Parameter erwartet.

Sie sollten das letzte sonst mit diesem ersetzen:

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

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

Sie müssen vor dem Sortieren eine Array-Variable zuweisen, die Sie dann in die Schreibleiste schreiben können.

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

    } 
2

Array.Sort ist eine Leere Methode, haben Sie Sort und Schreiben (auf Konsole) in zwei verschiedenen Aussagen zu trennen.

Ich würde vorschlagen, OrderBy linq Erweiterung und string.Join zusammen verwenden, um ein Liner Display zu haben.

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

Zuerst konvertieren als Array Objekt. dann sortiere dein Array und dann solltest du

Console.WriteLine(array) verwenden, um dein Array zu drucken.

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

statt

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

So Zeit Stellen Sie sich Ihren get Error: cannot convert from 'void' to 'bool'

0

Sie die Antworten auf alle danken. Ich komme aus Java, wo Sie direkt eine Sammlung drucken können, deshalb habe ich es so gemacht.