2009-11-30 77 views
2

我有一个数据表是这样的:排序数据表,列

 | 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 2013-06-04 05:23:54

回答

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

的好吧,我知道你的意思,和它的工作,相当不错,但它不是相当......“真正的”......不过,谢谢你的建议。 – 2009-11-30 13:46:55

+0

如果你想要更“真实”的东西,也许你可以在另一端工作。谁在制作数据表以及为什么列没有排序?您可能无法控制该查询或进程,但无法进行,然后在那里对列进行排序。 – 2009-11-30 13:51:53

+0

问题是,我无法控制用户向数据表添加新列的顺序。所以,例如如果他添加了一个应该在两个已经存在的列之间的新列,但是被添加为最后一列,那么我必须对每个列进行比较直到它适合: -/ – 2009-11-30 13:58:05

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

这里是前面答案的组合。使用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++; 
} 

(其中,“表”是你的DataTable的名称。)

+0

为什么downvotes? – Andy 2012-11-01 17:37:33

+0

同意安迪,如果人们打算投票下来,他们至少应该有礼貌解释原因。一个原因可能是排序按字母顺序排序,但如果你有Col1,Col2和Col11,你会发现结果排序是Col1,Col11,Col2。 – mattpm 2013-04-16 23:05:46