XMLより読み込んだDataTableのソートを数値ソートで行うには?

解決


マイセン  2009-07-13 05:38:24  No: 142208

VB2008 Expressを使用しています。
まず、以下のデータがあるXMLファイルがあったとします。

(途中略)
<DATA>
  <IDX>0</IDX>
  <TEXT>データ0</TEXT>
</DATA>
<DATA>
  <IDX>1</IDX>
  <TEXT>データ1</TEXT>
</DATA>
<DATA>
  <IDX>2</IDX>
  <TEXT>データ2</TEXT>
</DATA>
  ・
  ・
  ・
<DATA>
  <IDX>10</IDX>
  <TEXT>データ10</TEXT>
</DATA>
(以下略)

これを、DataSetに読み込み、DATAノード以下のデータをDataTableに取得しようと思っています。

Dim ds As New DataSet
Dim dt As DataTable = ds.Tables("DATA")
Dim adr() As DataRow = dt.Select("", "IDX")

ここでですが、上記のコードの最後の行で、DATAテーブルのIDXという項目でソートをかけていますが、
ソート順は、Stringとして扱われているのか、1, 10, 2, 3,...9の順になってしまいます。
しかしながら、これを数値でソートしたいのです。つまり、1, 2, 3,...9, 10の順にソートされるようにしたいのです。
項目IDXには、必ず数値(Integer相当)が入ります。
どうすればよいでしょうか?
よろしくお願いいたします。


マイセン  2009-07-13 06:22:09  No: 142209

とりあえず、読み取り用XMLにスキーマを設定し、IDX項目がIntになるようにすることにします。
これでIDXを数値ソートできるようになりました。


魔界の仮面弁士  2009-07-13 20:17:44  No: 142210

別案1) Integer 型の『式列』を追加し、それを用いてソートする。
dt.Columns.Add("F", GetType(Integer), "Convert(IDX, System.Int32)")
Dim adr() As DataRow = dt.Select("", "F")

別案2) OrderBy 拡張メソッドを用いてソートする。
Dim adr2() As DataRow = dt.AsEnumerable().OrderBy(Function(row) CInt(row("IDX"))).ToArray()

別案3) LINQ to DataSet を用いてソートする。
Dim adr3() As DataRow = (From x In dt Order By CInt(x.Field(Of String)("IDX"))).ToArray()


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加