Сортировка DataTable-столбцов - PullRequest
2 голосов
/ 30 ноября 2009

У меня есть данные вроде этого:

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

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

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

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

Ответы [ 6 ]

5 голосов
/ 30 ноября 2009

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

dt.Columns["Col0"].SetOrdinal(0);
dt.Columns["Col1"].SetOrdinal(1);
dt.Columns["Col2"].SetOrdinal(2);
4 голосов
/ 30 ноября 2009

Вам не нужно сортировать столбцы в объекте 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();
        }
2 голосов
/ 18 сентября 2011
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);
2 голосов
/ 12 мая 2011

Вот мой код, конечно, не лучшее решение, но работает. В моем случае я позволил фиксированный столбец, который может быть «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 голос
/ 30 ноября 2009

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

0 голосов
/ 02 марта 2012

Вот комбинация предыдущих ответов. Используйте встроенный метод 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++;
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...