0

我正在尝试对数据网格 A 到 Z 的列进行排序,下面的代码除了我在“A”之间得到一个以“c”开头的列(例如,a、a、a、a、c、a、 a,b,b,b),这发生在我第一次运行代码时。如果我然后使用 columnNames.Reverse(); (Z 到 A)然后重新运行 columnNames.Sort() (A 到 Z)它正确排序。为什么会这样?

 List<string> columnNames = new List<string>();
 foreach (DataGridViewColumn col in dataGridView1.Columns)
 columnNames.Add(col.HeaderText);
 columnNames.Sort();
 foreach (DataGridViewColumn col in dataGridView1.Columns)
     col.DisplayIndex = columnNames.IndexOf(col.HeaderText);

谢谢

4

1 回答 1

1

在您的示例中(“(a,a,a,a,c,a,a,b,b,b)”),列名不是唯一的。因此,在名称的排序列表中,“a”的(第一个)索引将为 0,“b”的(第一个)索引将为 5,“c”的(第一个)索引将为 8。

因此,当您遍历列时,您将反复将带有文本“a”的列设置为索引“0”。第二次执行此操作时,该位置的第一列将被移动以腾出空间。结果更像是洗牌而不是排序,最终的顺序取决于原始顺序。这就是为什么第二次排序工作正常的原因——在你的第一次通过时,你将元素排列得“足够接近”以使第二次尝试成功。

像下面这样的东西呢?它将唯一地分配索引,并且它也将更有效。(每次调用 IndexOf 都是 O(N),所以你的原始代码是 O(N^2) - 这只是 O(N log N),至少假设列集合在设置索引时不会重新排列太多.)

List<DataGridViewColumn> columns = new List<DataGridViewColumn>(dataGridView1.Columns);
columns.Sort( delegate(DataGridViewColumn a, DataGridViewColumn b) {
               return String.Compare( a.HeaderText, b.HeaderText ); }
int n = 0;
foreach( DataGridViewColumn col in columns )
   col.DisplayIndex = n++;
于 2008-12-05T01:51:53.430 回答