C#将堆栈转换为数组并对其进行排序

时间:2016-05-17 09:15:28

标签: c# arrays sorting stack return-type

我最近进入了C#,我试图了解一下Stacks。我想尝试对堆栈进行排序,首先将其转换为数组但我得到了一个奇怪的错误。

这是我的代码:

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:无法从'void'转换为'bool'

我想知道为什么会发生这种情况,当Array.Sort()需要一个数组作为参数时,我会传递number.ToArray(),它应该从数字中返回一个新数组堆栈。

7 个答案:

答案 0 :(得分:7)

出现错误的原因是 Array.Sort 返回 void ,而不是预期的数组

另外,Console.WriteLine获取输入并将其打印到Console,不能获取数组并打印该数组,它只会打印出实际的数组地址。

为了打印数组(或任何集合),您应该使用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

答案 1 :(得分:2)

Array.Sort对数组执行就地排序。它不会返回新的排序数组。因此它是一个Void函数。

修改您的代码;

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

答案 2 :(得分:2)

Array.Sort是一个 void 方法,您需要将Sort与写入(以控制台)分成两个不同的语句。

我建议使用OrderBy linq扩展名和string.Join一起显示一个内容。

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

答案 3 :(得分:1)

错误信息非常清楚。在这一行:

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

Array.Sort不会返回任何内容(无效),但您需要传递给需要参数的Console.WriteLine

您应该用以下内容替换最后一个:

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

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

答案 4 :(得分:1)

您需要在排序之前分配一个数组变量,然后您可以写入。

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

    }

答案 5 :(得分: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'

答案 6 :(得分:0)

感谢大家的回复。我来自Java,你可以直接打印一个集合,这就是为什么我尝试这样做的原因。