我有一个像这样的数据表:
| Col1 | Col6 | Col3 | Col43 | Col0 |
---------------------------------------------------
RowA | 1 | 6 | 54 | 4 | 123 |
如您所见,Col
未按其编号排序。这就是我希望它在“魔术”之后的样子:
| Col0 | Col1 | Col3 | Col6 | Col43 |
---------------------------------------------------
RowA | 123 | 1 | 54 | 6 | 4 |
C#中有这样的内置功能吗?如果没有,我怎么能开始这个?
答案 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的名称。)