- 題名: 構造体配列のソート
- 日時: 2008/04/21 15:07:45
- ID: 21894
- この記事の返信元:
- (なし)
- この記事への返信:
- [21895] Re[1]: 構造体配列のソート2008/04/21 15:14:45
- ツリーを表示
いろいろ調べた結果、下記のようにして実現できました。
'---------------------------------------------------
Dim TestData() As TEST
Dim SortTable As DataTable
Dim nrow As DataRow
Dim i As Integer
'[省略]TestData配列のデータ内容作成
SortTable = New DataTable("SortTable")
'列作成
With SortTable.Column
.Add("dataA")
.Add("dataB")
.Add("dataC")
End With
'DataTableにぶちこむ
For i = 0 To TestData.Length - 1
nrow = SortTable.NewRow()
nrow("dataA") = TestData(i).A
nrow("dataB") = TestData(i).B
nrow("dataC") = TestData(i).C
SortTable.Rows.Add(nrow)
Next
'ソート
SortTable.DefaultView.Sort() = "dataA ASC, dataB ASC"
'構造体配列に戻す
For i = 0 To TestData.Length - 1
With TestData(i)
.A = SortTable.Rows(i).Item("dataA")
.B = SortTable.Rows(i).Item("dataB")
.C = SortTable.Rows(i).Item("dataC")
End If
Next
'後処理は省略
'---------------------------------------------------
一応当初の目的は実現できたので、解決済みにしておきますが、
永遠の近鉄ファンさんの提示していただいたリンク先の方法で
できなかったのは謎なままなので情報提供待っています。
鶏唐揚さんはわんくま掲示板でよく見る鶏唐揚さんと同一人物なのかしら。
(あ、ちょっと気になっただけです。お気を悪くしないでください)
■No21910に返信(鶏唐揚さんの記事)
> 'ソート
> SortTable.DefaultView.Sort() = "dataA ASC, dataB ASC"
>
> '構造体配列に戻す
> For i = 0 To TestData.Length - 1
> With TestData(i)
> .A = SortTable.Rows(i).Item("dataA")
> .B = SortTable.Rows(i).Item("dataB")
> .C = SortTable.Rows(i).Item("dataC")
> End If
> Next
ここですが、ソートしたのであればソート後の DataView を
利用して
> 'ソート
> SortTable.DefaultView.Sort() = "dataA ASC, dataB ASC"
>
> '構造体配列に戻す
> For i = 0 To TestData.Length - 1
> With TestData(i)
> .A = SortTable.DefaultView(i).Item("dataA")
> .B = SortTable.DefaultView(i).Item("dataB")
> .C = SortTable.DefaultView(i).Item("dataC")
> End If
> Next
こんな感じになるんじゃないでしょうか。
# 個人的には DataTable に変換する手間を考えると、じゅでさんの
# 方式が素直なような気がしますね
分類:[.NET]
お久しぶりですお世話になってます。
今回、構造体配列のソートについて質問させていただきます。
ある構造体TESTには、A、B、Cというメンバがあるとします。
ここで、Aの昇順・Bの昇順 で並べ替えたいと思います。
SQLでいうとこの「ORDER BY A, B」というものです。
全部自前でやるには相当なコーディングが必要なのと、
今回データ件数がかなり多くて速度的に心配なので、
メソッドか何かで一発でできる方法があればご教示願います。
同じような質問は多数見つけたのですが、どれも解決に至ってないようなので
新規にて質問させていただきました。よろしくお願いします