2009-11-30 2 views
2

У меня есть DataTable что-то вроде этого:Сортировка DataTable-столбцы

 | Col1 | Col6 | Col3 | Col43 | Col0 | 
--------------------------------------------------- 
RowA | 1 | 6 | 54 | 4 | 123 | 

Как вы видите, Col s не отсортированный по их номерам. Это то, что я хочу, чтобы она выглядела, как после «магии»:

 | Col0 | Col1 | Col3 | Col6 | Col43 | 
--------------------------------------------------- 
RowA | 123 | 1 | 54 | 6 | 4 | 

Есть встроенная функция для таких вещей, в C#? А если нет, как я мог бы начать с этого?

+1

+1 решить подобную проблему моего – Devjosh

ответ

4

Вам не нужно сортировать столбцы в объекте DataTable, просто скопировать имена столбцов в массив и отсортировать массив. Затем используйте массив для доступа к значениям столбца в правильном порядке.

Пример:

class Program 
    { 
     static void Main(string[] args) 
     { 
      var dt = new DataTable { Columns = { "A3", "A2", "B1", "B3", "B2", "A1" } }; 
      dt.BeginLoadData(); 
      dt.Rows.Add("A3val", "A2val", "B1val", "B3val", "B2val", "A1val"); 
      dt.EndLoadData(); 

      string[] names=new string[dt.Columns.Count]; 
      for (int i = 0; i < dt.Columns.Count;i++) 
      { 
       names[i] = dt.Columns[i].ColumnName; 
      } 
      Array.Sort(names); 

      foreach (var name in names) 
      { 
       Console.Out.WriteLine("{0}={1}", name, dt.Rows[0][name]); 
      } 
      Console.ReadLine(); 
     } 
+0

Хорошо, я знаю, что вы имеете в виду, и он будет работать, очень хорошо, но это не так довольно ... «подлинные» ... Тем не менее, спасибо за совет. –

+0

Если вы хотите что-то более «подлинное», возможно, вы можете работать на другом конце. Кто создает данные и почему столбцы не упорядочены? Вероятно, вы не можете контролировать этот запрос или процесс, но вы можете, а затем сортировать столбцы. –

+0

Проблема в том, что я не могу контролировать порядок, в котором пользователь добавляет новые столбцы в таблицу данных. Так, например, если он добавит новый столбец, который должен находиться между двумя уже существующими, но будет добавлен в качестве последнего столбца, мне придется сравнивать каждый, пока он не поместится: -/ –

1

Возможно, вам понадобится реализовать свой IComparer<T>, так как «естественный» заказ будет: Col0, Col1, Col3, Col43 и Col6. («4» предшествует «6»)

5

Вы можете сделать столбец сортировки в самой таблице:

dt.Columns["Col0"].SetOrdinal(0); 
dt.Columns["Col1"].SetOrdinal(1); 
dt.Columns["Col2"].SetOrdinal(2); 
2

Вот мой код, конечно, не является лучшим решением, но работает. В моем случае я допускаю фиксированный столбец, который может быть «Nombre» или «Problem», это всегда будет первым в порядке столбцов.

// class 
public class stringInt 
{ 
    public string Nombre; 
    public int orden; 
} 

// function 

static public DataTable AlphabeticDataTableColumnSort(DataTable dtTable) 
{ 
    //vamos a extraer todos los nombres de columnas, meterlos en una lista y ordenarlo 
    int orden = 1; 
    List<stringInt> listaColumnas = new List<stringInt>(); 

    foreach (DataColumn dc in dtTable.Columns) 
    { 
     stringInt columna = new stringInt(); 
     columna.Nombre = dc.Caption; 
     if ((dc.Caption != "Problema") && (dc.Caption != "Nombre")) columna.orden = 1; 
     else columna.orden = 0; 
     listaColumnas.Insert(0,columna); 
    } 
    listaColumnas.Sort(delegate(stringInt si1, stringInt si2) { return si1.Nombre.CompareTo(si2.Nombre); }); 

    // ahora lo tenemos ordenado por nombre de columna 
    foreach (stringInt si in listaColumnas) 
    { 
     // si el orden es igual a 1 vamos incrementando 
     if (si.orden != 0) 
     { 
      si.orden = orden; 
      orden++; 
     } 
     } 
     listaColumnas.Sort(delegate(stringInt si1, stringInt si2) { return si1.orden.CompareTo(si2.orden); }); 

     // tenemos la matriz con el orden de las columnas, ahora vamos a trasladarlo al datatable 
     foreach(stringInt si in listaColumnas) 
      dtTable.Columns[si.Nombre].SetOrdinal(si.orden); 


     return dtTable; 
} 
1
var columnArray = new DataColumn[table.Columns.Count]; 
table.Columns.CopyTo(columnArray, 0); 
var ordinal = -1; 
foreach (var orderedColumn in columnArray.OrderBy(c => c.ColumnName)) 
    orderedColumn.SetOrdinal(++ordinal); 
-1

Вот сочетание предыдущих ответов. Используйте метод Sort() для List или Array строк для сортировки списка имен столбцов, а затем используйте метод DataColumn.SetOrdinal() для изменения столбцов DataTable в соответствии с отсортированным списком.

List<string> columnNames = new List<string>(); 
foreach (DataColumn col in table.Columns) 
{ 
    columnNames.Add(col.ColumnName); 
} 
columnNames.Sort(); 

int i = 0; 
foreach (string name in columnNames) 
{ 
    table.Columns[name].SetOrdinal(i); 
    i++; 
} 

(где «таблица» это имя вашей DataTable.)

+0

Почему downvotes? – Andy

+0

согласился с Энди, если люди собираются проголосовать, они должны по крайней мере иметь любезность, чтобы объяснить, почему. Одна из причин может заключаться в том, что сортировка будет сортироваться в алфавитном порядке, но если у вас есть Col1, Col2 и Col11, вы увидите, что в результате сортировка будет Col1, Col11, Col2. – mattpm

Смежные вопросы