【问题标题】:how to sort DataTable columns order base on the condition如何根据条件对 DataTable 列进行排序
【发布时间】:2013-04-22 09:04:32
【问题描述】:

通过执行这样的存储过程,我有一个动态数据表:

A B C D

1 0 0 1

0 0 0 1

1 1 0 1

如何根据每列的总和降序排序?我想要它:

D A B C

1 1 0 0

1 0 0 0

1 1 1 0

我创建了一个列表来存储每列的总和:

List<Column> temptArray;
public class Column
{
    public int columnIndex;
    public int count;
}

我计算总和

private void calculateSum()
    {
        temptArray= new List<Column>();
        for (int column = 0; column <= dataTable.Columns.Count -1; column++)
            temptArray.Add(new Column{ columnIndex = column });

        for (int row = 0; row <= dataTable.Rows.Count - 1; row++)
            for (int column = 0; column <= dataTable.Columns.Count - 1; column++)
                temptArray[column].count+= (int)dataTable.Rows[row].ItemArray.GetValue(column);
}

效果很好。

然后我对我的 temptArray 进行排序:

temptArray = temptArray.OrderByDescending(x => x.count).ToList();

现在应该订购我的 temptArray:DABC

如何像 temptArray 一样更改 DataTable 的顺序?

【问题讨论】:

    标签: c# sorting datatable calculated-columns


    【解决方案1】:

    尝试使用DataColumn.SetOrdinal 方法。例如:

    dataTable.Columns["D"].SetOrdinal(0); 
    dataTable.Columns["A"].SetOrdinal(1);
    dataTable.Columns["B"].SetOrdinal(2); 
    dataTable.Columns["C"].SetOrdinal(3);
    

    这里是示例代码:

    // this is sample C# console application 
    using System.Data;
    using System.Linq; 
    
    namespace SO
    {
        class Program
        {
            static void Main(string[] args)
            {
                DataTable dt = GetTable();
                // get list of Data Table column names like A, B, C, D...
                var columnNames = (from DataColumn col in dt.Columns
                                   select col.ColumnName).ToList();
                // compute sum for each column and get list of objects which having sum and column name as property. 
                var computed = columnNames.Select(c => new { ColumnName = c, Sum = dt.Compute(string.Format("Sum({0})", c), "") }).OrderByDescending(p => p.Sum).ToList();
    
                // set the column position based on Sum of the column 
                for (int i = 0; i < computed.Count(); i++)
                {
                    dt.Columns[computed[i].ColumnName].SetOrdinal(i);
                }
    
            }
            // testing I have added this method to create Data Table with testing data
            static DataTable GetTable()
            {
                DataTable table = new DataTable();
                table.Columns.Add("A", typeof(int));
                table.Columns.Add("B", typeof(int));
                table.Columns.Add("C", typeof(int));
                table.Columns.Add("D", typeof(int));
    
                table.Rows.Add(1, 0, 0, 1);
                table.Rows.Add(0, 0, 0, 1);
                table.Rows.Add(1, 1, 0, 1);
    
                return table;
            }
        }
    }
    

    【讨论】:

    • 感谢达米特。你能告诉我 columnNames 和计算的类型是什么吗?因为我只使用 C# 我对 VB 不太了解。对不起。
    • @CuồnYết 我添加了几个cmets,请检查
    • 因为在我认为它是 VB 之前我从未使用过“var”。谢谢达米特。我会试试的。
    猜你喜欢
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多