【问题标题】:C# converting a stack to an array and sorting itC# 将堆栈转换为数组并对其进行排序
【发布时间】:2016-09-13 07:19:39
【问题描述】:

我最近接触了 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()));


    }
}

我的问题是我的代码的最后一个 else 部分(最后一行):

参数 1:无法从 'void' 转换为 'bool'

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

【问题讨论】:

  • 您不应该对堆栈进行排序。它破坏了整个堆栈的目的。
  • void 方法不返回任何内容,因此您不能在方法中使用它作为参数。下一个问题:你不能Console.WriteLine 整个数组。您需要枚举它或使用String.Join(",", numbers)
  • Array.Sort 不返回任何内容。它就地对数组进行排序。

标签: c# arrays sorting stack return-type


【解决方案1】:

由于 Array.Sort 返回 void 而不是预期的 array 而出现错误。

另外,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

【讨论】:

  • 这有一个额外的好处是堆栈保持不变。
【解决方案2】:

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

修改你的代码;

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

【讨论】:

  • Console.WriteLine(numberArray) 没用
  • 同意 - 但不是 OP 查询的内容。
  • 不,但他将有下一期。 Console.WriteLine(string.Join(",", numberArray)); 修复它
【解决方案3】:

Array.Sort 是一个 void 方法,您必须将Sort 分开并在两个不同的语句中写入(到控制台)。

我建议将OrderBy linq 扩展和string.Join 一起使用以显示一个衬里。

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

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

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

      你应该用这个替换最后一个else:

      var numbersArray = numbers.ToArray();
      Array.Sort(numbersArray);
      
      Console.WriteLine(string.Join(",", numbers));
      

      【讨论】:

        【解决方案6】:

        首先转换为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'

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            猜你喜欢
            • 2012-10-09
            • 1970-01-01
            • 2011-06-23
            • 1970-01-01
            • 2020-08-24
            • 1970-01-01
            • 1970-01-01
            • 2013-06-19
            • 2022-07-07
            相关资源
            最近更新 更多