0

Datatable での並べ替えについて質問があります。以下のようなテーブルがあり、小さいものから大きいものへと並べ替えたいと考えています。問題は、私が同じ番号を持っている場合、最初のものを最後にしたいなどです...

表: -----------------------------------ソート後:

Name   Bit   Size                      Name    Bit     Size    (corrected)
 A      0     1                         A      0         1
 C      1     2                         C      1         2   
 B      1     3                         B      1         3
 D      1     1                         D      1         1

私が望む結果:

Name    Bit   Size (corrected)
 A      0     1  
 D      1     1
 B      1     3
 C      1     2

私のコード:

arraySBit.DefaultView.Sort = "Bit";
arraySBit = arraySBit.DefaultView.ToTable();
4

3 に答える 3

1

使用できますLinq-To-DataTable

var tblSorted = table.AsEnumerable()
                     .OrderBy(r => r.Field<int>("Bit"))
                     .CopyToDataTable();

編集:しかし、実際にDataView.Sortは動作するはずです(テスト済み)。

質問を編集したので。あなたの要件は奇妙に思えます。が同じである場合、Bit何かで並べ替えたくはありませんがreverse、等しい行の行の「順序」が必要です (つまり、 のOrdinal位置DataTable)。

これはあなたが望むことをしますが、それが本当に必要なものかどうかはわかりません:

DataTable tblSorted = table.AsEnumerable()
                 .Select((Row, Ordinal) => new {Row,Ordinal})
                 .OrderBy(x => x.Row.Field<int>("Bit"))
                 .ThenByDescending(x => x.Ordinal)
                 .Select(x => x.Row)
                 .CopyToDataTable();

基本的に、このオーバーロードを介してテーブル内の行のインデックスをEnumerable.Select匿名型に渡します。次に、Bit最初とインデックス/序数で並べ替えます。

于 2013-01-08T13:33:38.983 に答える
0

回避策、

これらの行の後、必要に応じて arrySBit になるはずです

DataTable arrySBitClone = arrySBit.Copy();
arrySBit.DefaultViewSort.Sort = "Bit";

bool different = false;
for(int i=0; i<arrySBit.Rows.Count; i++)
{
  if(arrySBit.Rows[i]["Bit"]!=arrySBitClone.Rows[i]["Bit"])
  {
    difference = true;
    break;
  }
}

if(!different)
{
  arrySBit = arrySBit.Copy(); 
}
于 2013-01-08T13:50:40.283 に答える
0

あなたの質問が正しければ。Select を使用しないのはなぜですか。

DataTable dt = arraySBit.Select("", "ビット、サイズ").CopyToDataTable();

Select メソッドの最初のパラメータはフィルタリングする条件で、2 番目のパラメータは Order By であるため、機能するはずです。

于 2013-01-08T15:46:37.913 に答える