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