对DataTable列进行排序

时间:2009-11-30 13:12:40

标签: c# sorting datatable

我有一个像这样的数据表:

     |  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 个答案:

答案 0 :(得分:5)

您可以在表格中进行列排序:

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

答案 1 :(得分: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();
        }

答案 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;
}

答案 3 :(得分:2)

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

答案 4 :(得分:1)

您可能需要实施IComparer<T>,因为“自然”顺序为:Col0,Col1,Col3, Col43 和Col6。 (“4”出现在“6”之前)

答案 5 :(得分:-1)

以上是前面答案的组合。使用List的内置Sort()方法或字符串数​​组对列名列表进行排序,然后使用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++;
}

(其中“table”是您的DataTable的名称。)