DOBON.NET DOBON.NETプログラミング掲示板過去ログ

リストビューの数値がLong型だとソートされません

環境/言語:[WinXP,VB.NET,NET Framework 1.1]
分類:[.NET]

初心者なりにがんばってはいるのですがよろしくお願いします。

現在下記のURLに掲載されている方法を参考にしてリストビュー内の列ごとをソートを作成しています。
http://dobon.net/vb/dotnet/control/lvitemsort.html
ソートする値がString、Integer、DateTimeなら正常にソートできたのですが、桁の大きな数値を含む列をソートさせようとすると「演算操作の結果オーバーフローが発生しました」とエラーが表示されます。
Long型を使用してもReturnで値を返す部分でやはり同じエラーが出ます。

Public Function Compare(ByVal x As Object, ByVal y As Object) _
As Integer Implements IComparer.Compare

上記のコードを見るとIntegerと記述があります。これのせいかと思い変更しようとしたのですが、ヘルプでCompareメソッドを見るとどうもIntegerでなければ構文にならない(?)ようで変更すると構文エラーになります。

ソートさせようとしているのは1桁から最大12桁の整数です。桁が少なければ問題ないのですが大きな桁を含む場合はエラーになります。
0を並べて桁数を揃えた上でString型としての処理も検討しましたが、見づらくなってしまうのでできれば避けたいです。
回避しつつソートさせる手段はありませんでしょうか?よろしくお願いします。
MAMです。
タイトルの表現に問題がありました。
申し訳ありません。
「リストビューの値の桁数が多いとソートされない」とした方が的確だったかと思います。
> 桁の大きな数値を含む列をソートさせようとすると「演算操作の結果オーバーフローが発生しました」とエラーが表示されます。
> Long型を使用してもReturnで値を返す部分でやはり同じエラーが出ます。

まず、次の各値の意味を理解しましょう。

> Public Function Compare(ByVal x As Object, ByVal y As Object) _
> As Integer Implements IComparer.Compare

Compareは実際のソート処理の内部から比較する2つのオブジェクトを引数として随時呼ばれます。
ここでのAs IntegerはあくまでCompareの返す結果であり「0:同値、>0:x>y、<0:x<y」という意味を持っています。

> result = Integer.Parse(itemx.SubItems(_column).Text) - _
> Integer.Parse(itemy.SubItems(_column).Text)
> Return result

Return resultのresultは上記で書いた意味のInteger値である必要があります。
つまり
・同値の場合、0を返す
・x<yの場合、Integerの範囲で0より小さい値を返す
・x>yの場合、Integerの範囲で0より大きい値を返す
を満たせばよいわけです。
これに対して最初のresult = は引き算の結果です。
意味の違う2つの値を一つの変数でまかなっているのは、すべてがIntegerであるため
自然とReturn resultの値の条件を満たしているからです。
つまり、上記の3つはIf文なりで別に書くべきところですが、そういう理由でいい意味で横着しているのです。

> ソートさせようとしているのは1桁から最大12桁の整数です。桁が少なければ問題ないのですが大きな桁を含む場合はエラーになります。

先の引き算の方式で言えば、型をすべてその仕様に耐えうる範囲の型にする必要があります。
しかしIntegerより大きな範囲の型をIntegerへ変換はできません。(原則的に)
先に書いたようにIf文なりでReturn文を分岐すればその必要が無いことがわかると思います。
まどかさんありがとうございます!
Compareでのreusltや比較の意味が分かっていませんでした。
今回はresultの値が正数ならresult = 1、負数ならresult = -1と代入するif文を付け加えることで解決いたしました。

> つまり、上記の3つはIf文なりで別に書くべきところですが、そういう理由でいい意味で横着しているのです。

特にこのお言葉で一気に謎が解けました。
きっと初歩的であろう質問に丁寧にお答えいただき本当にありがとうございます。
恐縮ですがまた機会があればなにとぞよろしくお願いいたします。
解決済みチェック漏れでした。
なんだかたびたびすいません。
落ち着きます。。。。。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板