こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

1次元配列のソート方法

配列のソートメソッドについて質問させていただきます。
VB.NET初心者なので日本語がおかしいかもしれませんが、宜しくお願いいたします。

データテーブルが格納されている配列があり、
その配列をソートしたいと思っています。
データテーブルの中に「NO」と「ID」というフィールドがあります。

NOで昇順し、NOが同じだったらIDの昇順でソートといったことがしたいのですが、
条件によっては上手くいきません。
よろしければ、教えていただけないでしょうか?
また、もっと効率の良い方法とかありましたら、具体的はソース等教えていただけないでしょうか?
宜しくお願いいたします。

[例]
workDT() ← 元のデータテーブル配列
Dim Datatable(workDt.Rows.Count-1) As DataTable ← ソート後のデータテーブル配列
Dim tmpDatatable(workDT.Rows.Count-1) As DataTable ← 途中で使うデータテーブル配列
Dim NO(workDT.Rows.Count-1) As Integer ← 元のデータテーブル配列の各「NO」フィールドを格納する配列
Dim ID(workDT.Rows.Count-1) As String ← 途中で使うデータテーブル配列の各「ID」フィールドを格納する配列
Dim Index(workDT.Rows.Count-1) As Integer ← インデックスに使用

' IDでソート
For i = 0 To workDt.Length - 1
ID(i) = workDt(i).Rows(0).Item("ID")
Index(i) = i
Next

' 配列をIDでソート
Array.Sort(ID, Index)

' ソート後配列をテンプ配列に格納
For i = 0 To workDt.Length - 1
tmpDatatable(i) = workDt(Index(i)).Copy
Next

' NOでソート
For i = 0 To tmpDatatable.Length - 1
NO(i) = tmpDatatable(i).Rows(0).Item("NO")
Index(i) = i
Next

' 配列をNOでソート
Array.Sort(NO, Index)

' ソート後配列を格納
For i = 0 To tmpDatatable.Length - 1
Datatable(i) = tmpDatatable(Index(i)).Copy
Next

これで各配列を初期化します。
workDTに5つのデータテーブルが入っていて
workDT(0):ID=3、NO=1
workDT(0):ID=1、NO=5
workDT(0):ID=2、NO=5
workDT(0):ID=4、NO=5
workDT(0):ID=5、NO=7
(IDは重複不可設定、NOは重複可設定です。)
とした場合、NOのソートのところで変な順番になってしまいます。
Array.Sort(NO, Index)
このメソッドは同じ値だった場合、何を優先してソートしているのでしょうか?

環境はWindowsXPSP3とVB2005です。

投稿日時 - 2010-01-18 11:31:24

QNo.5602211

すぐに回答ほしいです

質問者が選んだベストアンサー

DataTable をソートするには DataView クラスを用います。

ソート順を NO>ID とする場合

DIM DV as Dataview = new Dataview( _
WorkDT,"","NO asc,ID asc",DataViewRowState.CurrentRows)

となります。

参考:
■ [ADO.NET]データテーブル(DataTable)内のレコードをソートするには?
(データビューを利用したデータテーブルのソート)
http://www.atmarkit.co.jp/fdotnet/dotnettips/363dtsort/dtsort.html

投稿日時 - 2010-01-25 10:17:04

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問