1

我一直在使用 Array.Sort() 对字符串数组进行排序,但由于某种原因,它保留了数组的第一个元素并且不按顺序输出。

    private void quicksort1_Click(object sender, EventArgs e)
    {


        String[] parts = new String[1000];

        //System.IO.StreamReader file = new System.IO.StreamReader(textBox1.Text);
        System.IO.StreamWriter output = new System.IO.StreamWriter("OUTPUT.txt");

        parts = File.ReadAllLines(textBox1.Text);
        foreach (string s in parts)
        {
                Array.Sort(parts);
                parts.Equals(s);
                output.WriteLine(s);
                counter++;

        }
        output.WriteLine("There were" + " "  + counter + " " + "lines read in.");

        output.Close();

我只是想知道是否有可能的解决方案来解决 Array.Sort() 对第一个元素以及其他元素进行排序的位置。

4

3 回答 3

4

现在,您每行对整个集合进行一次排序。相反,您可以在循环之前对行进行一次排序。

在您当前的代码中,第一行显示为未排序,因为您在排序之前获取它:

foreach (string s in parts) // Getting s from the original array
{
   Array.Sort(parts);  //Sorting array
   // s is unchanged - at this point its still the first element from the original array

相反,先整理一下。试试这个:

private void quicksort1_Click(object sender, EventArgs e)
{
  using (var output = new System.IO.StreamWriter("OUTPUT.txt"))
  {
    string[] parts = File.ReadAllLines(textBox1.Text);
    Array.Sort(parts);
    foreach (string s in parts)
    {
        output.WriteLine(s);
    }

    output.WriteLine("There were {0} lines read in.", parts.Length);
  }

    }

请注意,这里也不需要counter变量,并且切换代码以使用该using语句可以稍微简化逻辑。

于 2013-05-23T16:54:40.977 回答
2

这需要在循环之外(在循环之前):Array.Sort(parts);

当您完成排序时,您已经在访问第一个元素。第一个元素正在数组中排序,您刚刚在枚举中的前一个位置访问了它。

于 2013-05-23T16:55:33.820 回答
0

您正在使用 line 输出第一行output.WriteLine(s)。问题是s在列表排序之前从您的列表中检索。

于 2013-05-23T17:00:02.470 回答