2008-12-05 5 views
0

Я пытаюсь сортировать столбцы данных с A по Z, код ниже работает, кроме того, что я получаю столбец, начинающийся с 'c' между «A» (например, a, a, a, a, c, a, a, b, b, b), это происходит при первом запуске кода. Если я тогда использую columnNames.Reverse(); (От Z до A), а затем повторно запустить columnNames.Sort() (от A до Z), он сортируется правильно. Почему это должно быть?Сортировка столбцов datagrid, у меня есть код и его вид работ

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); 

Благодаря

ответ

1

В вашем примере ("(а, а, а, а, с, а, а, б, б, б)"), имена столбцов не являются уникальными. Таким образом, в отсортированном списке имен (первый) индекс «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++;