linqっての使ってみた

一覧表でカラムをクリックするとソートする機能を作るのに、めんど臭くなって・・
調べているとlinqというSQLで配列を扱う機能があるじゃないですか。
飛びついて組み込んでみると・・・

Dim a = From c As UserTableCls In UserTable Order By c.userid Select c
UserTable.Clear()
UserTable.AddRange(a)

うや?空っぽになったw
どうしてダーと、デバッグモードで動かしてみると。

UserTable.Clear()

どうやらこの行で消えてるようです。
aの変数にカーソルを当てると、メモリー上のテーブル・・・
あーーaという変数には実体はなくて、ポインターがあるだけだから、もとの変数を消してしまうと消えてしまうんだw

Dim a = From c As UserTableCls In UserTable Order By c.userid Select c
Dim b As New List(Of UserTableCls)
b.AddRange(a)
UserTable.Clear()
UserTable.AddRange(b)

一度、bというテーブルに実体を移してから、もとに戻す方法に・・・

すると、別のところでエラーが・・・w
仮想モードlistviewのデータテーブルになってるので、listviewから消えた瞬間にアクセスされてしまい、テーブルに無いインデックスを指定しないで!みたいなことをいわれてしまいました。

UserList.VirtualListSize = 0
Dim a = From c As UserTableCls In UserTable Order By c.userid Select c
Dim b As New List(Of UserTableCls)
b.AddRange(a)
UserTable.Clear()
UserTable.AddRange(b)
UserList.VirtualListSize = UserTable.Count

いじる前に仮想リストビューに0を設定してデータが無い状態にしてしまって、作業後に復帰させる方法にしてみました。
無事できたーということで、同じコードをカラムのある分だけ作成

Select Case e.Column
Case 0 'ID
UserList.VirtualListSize = 0
Dim a = From c As UserTableCls In UserTable Order By c.userid Select c
Dim b As New List(Of UserTableCls)
b.AddRange(a)
UserTable.Clear()
UserTable.AddRange(b)
UserList.VirtualListSize = UserTable.Count

Case 1 'dispname
UserList.VirtualListSize = 0
Dim a = From c As UserTableCls In UserTable Order By c.DisplayName Select c
Dim b As New List(Of UserTableCls)
b.AddRange(a)
UserTable.Clear()
UserTable.AddRange(b)
UserList.VirtualListSize = UserTable.Count

Case 2 'charaname
UserList.VirtualListSize = 0
Dim a = From c As UserTableCls In UserTable Order By c.CharaName Select c
Dim b As New List(Of UserTableCls)
b.AddRange(a)
UserTable.Clear()
UserTable.AddRange(b)
UserList.VirtualListSize = UserTable.Count

Case 3 'charaname
UserList.VirtualListSize = 0
Dim a = From c As UserTableCls In UserTable Order By c.LastComment Select c
Dim b As New List(Of UserTableCls)
b.AddRange(a)
UserTable.Clear()
UserTable.AddRange(b)
UserList.VirtualListSize = UserTable.Count

Case 4 'charaname
UserList.VirtualListSize = 0
Dim a = From c As UserTableCls In UserTable Order By c.LastAccess Select c
Dim b As New List(Of UserTableCls)
b.AddRange(a)
UserTable.Clear()
UserTable.AddRange(b)
UserList.VirtualListSize = UserTable.Count

Case 5 'charaname
UserList.VirtualListSize = 0
Dim a = From c As UserTableCls In UserTable Order By c.CommentCount Select c
Dim b As New List(Of UserTableCls)
b.AddRange(a)
UserTable.Clear()
UserTable.AddRange(b)
UserList.VirtualListSize = UserTable.Count
End Select

単なる作業でしたw

linqっていうの結構使えそうです。
チョロッと検索したいときとか、for文+ifでやるより、where文で書いちゃうほうが見やすいしね。