1

次のようにストアド プロシージャを実行して、動的な DataTable を作成します。

あいうえお

1 0 0 1

0 0 0 1

1 1 0 1

各列の合計に基づいて降順に並べ替えるにはどうすればよいですか? 私はそれがほしい:

DABC

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 の順序を変更するにはどうすればよいですか?

4

1 に答える 1

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;
        }
    }
}
于 2013-04-28T18:18:19.353 に答える