使用Array.Sort()排序元素不排序第一个元素

时间:2013-05-23 16:53:00

标签: c# arrays sorting

我一直在使用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()会对第一个元素以及其他元素进行排序。

3 个答案:

答案 0 :(得分: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 statement可以简化逻辑。

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

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