C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: DataTableを該当カラムの文字数でソートするには?


(過去ログ 101 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■60712 / inTopicNo.1)  DataTableを該当カラムの文字数でソートするには?
  
□投稿者/ ザキヤマ (2回)-(2011/07/15(Fri) 22:23:14)

分類:[VB.NET/VB2005 以降] 

開発環境 VB 2008

DataTableに"ID"と"TEXT"というカラムがあるとします。
DataTable dtを、ID=1の行を、TEXTカラムでソートするのに、以下の方法で行っています。

Dim dr() As DataRow = dt.Select("ID = 1", "TEXT")

今回、DataTable dtを、ID=1の行を、TEXTカラムの文字数でソートしたいのですが、そのようにすればよいでしょうか?
結果をDataRow配列にする場合、dt.Selectメソッドの第二引数をどのように設定すればいいかが分かりません。
結果はDataRow配列でなくともいいので、ご回答よろしくお願い申しあげます。
引用返信 編集キー/
■60713 / inTopicNo.2)  Re[1]: DataTableを該当カラムの文字数でソートするには?
□投稿者/ shu (856回)-(2011/07/15(Fri) 23:01:35)
No60712 (ザキヤマ さん) に返信
> 開発環境 VB 2008
>
> DataTableに"ID"と"TEXT"というカラムがあるとします。
> DataTable dtを、ID=1の行を、TEXTカラムでソートするのに、以下の方法で行っています。
>
> Dim dr() As DataRow = dt.Select("ID = 1", "TEXT")
>
> 今回、DataTable dtを、ID=1の行を、TEXTカラムの文字数でソートしたいのですが、そのようにすればよいでしょうか?
> 結果をDataRow配列にする場合、dt.Selectメソッドの第二引数をどのように設定すればいいかが分かりません。
> 結果はDataRow配列でなくともいいので、ご回答よろしくお願い申しあげます。

Linqを使ってこんな感じ

Dim rows = (From row In dt.AsEnumerable _
Where row.Field(Of Integer)("ID") = 1 _
Order By row.Field(Of String)("Text").Length).ToArray
引用返信 編集キー/
■60715 / inTopicNo.3)  Re[1]: DataTableを該当カラムの文字数でソートするには?
□投稿者/ 魔界の仮面弁士 (2253回)-(2011/07/16(Sat) 00:34:53)
No60712 (ザキヤマ さん) に返信
> DataTableに"ID"と"TEXT"というカラムがあるとします。
ID は Integer 型、Text は String 型で
PrimaryKey は設定されていないという状況で良いですか?


> 今回、DataTable dtを、ID=1の行を、TEXTカラムの文字数でソートしたいのですが、そのようにすればよいでしょうか?

Linq 案は shu さんが既に書かれているので、「式列」を用いた場合を。

dt.Columns.Add("TextLength", GetType(Integer), "LEN(TEXT)")
Dim 案2() As DataRow = dt.Select("ID=1", "TextLength")



■No60713 (shu さん) に返信
> Dim rows = (From row In dt.AsEnumerable _
> Where row.Field(Of Integer)("ID") = 1 _
> Order By row.Field(Of String)("Text").Length).ToArray

TEXT が DBNull だった場合にも対応させるための別案として。

Dim 案1a() As DataRow = (From row In dt Where row!ID = 1 _
    Order By row("TEXT").ToString().Length).ToArray()

Dim 案1b() As DataRow = (From row In dt Where row!ID = 1 _
        Order By If(row.IsNull("TEXT"), Integer.MinValue, Len(row!TEXT))).ToArray()


案1a は、空文字列と DBNull を共に「長さゼロ」として並び替えます。

案1b は、DBNull を空文字列よりも短い文字列として並び替えます。

引用返信 編集キー/
■60718 / inTopicNo.4)  Re[2]: DataTableを該当カラムの文字数でソートするには?
□投稿者/ ザキヤマ (3回)-(2011/07/16(Sat) 06:30:35)
おはようございます。
いやぁ、全英オープンを見ながら居眠りしてしまったw

shuさま、魔界の仮面弁士さま、ご回答ありがとうございました。
Linqを使う方法は便利そうですね。
DataTableのSelectは、抽出条件の式を文字列で設定する必要がある(例えば、"ID = 1"という文字列)のに対し、
Linkは変数で条件式を設定できるので、とてもいいです。

ところで、魔界の仮面弁士さまの例だと、

> Dim 案1a() As DataRow = (From row In dt Where row!ID = 1 _

とありますが、row!ID の部分はrow("ID")としてもいいんですよね?
(なるべく記載方法を統一したいもので...)
引用返信 編集キー/
■60722 / inTopicNo.5)  Re[3]: DataTableを該当カラムの文字数でソートするには?
□投稿者/ shu (858回)-(2011/07/16(Sat) 07:49:18)
No60718 (ザキヤマ さん) に返信

> とありますが、row!ID の部分はrow("ID")としてもいいんですよね?
> (なるべく記載方法を統一したいもので...)

!ID、![ID]、("ID")はおなじです。
※ただし("ID")がDefult Propertyによるものであること。

引用返信 編集キー/
■60723 / inTopicNo.6)  Re[3]: DataTableを該当カラムの文字数でソートするには?
□投稿者/ 魔界の仮面弁士 (2254回)-(2011/07/16(Sat) 08:29:33)
No60718 (ザキヤマ さん) に返信
>>> dt.Columns.Add("TextLength", GetType(Integer), "LEN(TEXT)")
>>> Dim 案2() As DataRow = dt.Select("ID=1", "TextLength")
追加した式列が邪魔な場合は、DataRow 配列を得た後で
 dt.Columns.Remove("TextLength")
を実行するなどして除去しておいてください。


>> Linkは変数で条件式を設定できるので、とてもいいです。
Linq を使った行は、エディット コンティニュ(一時停止作業中のコード編集)を
利用できないという制限がありますので、その点は注意が必要ですね。

まぁ、C# よりは制限が緩いのですけれども。
(VB は Linq 行のみが編集禁止。C# は Linq 呼び出しを含むメソッド全体が編集禁止。)
http://msdn.microsoft.com/ja-jp/library/bb763103.aspx



>>Dim 案1a() As DataRow = (From row In dt Where row!ID = 1 _
> とありますが、row!ID の部分はrow("ID")としてもいいんですよね?
はい。「row!ID」も「row("ID")」も、いずれも「row.Item("ID")」の呼び出しを意味します。

感嘆符演算子(ディクショナリアクセス演算子)は、
『String に相当する引数 1 つだけを受け取るインデクサなプロパティ』を
呼び出すための表記です。


> (なるべく記載方法を統一したいもので...)
その通りですね。すみません。(^^;

なお、ID 列から DBNull 値が返される可能性がある場合には、
「Where row("ID") = 1」はエラーとなります。

DBNull がありうる場合は、拡張メソッド Field を用いて
null 許容型として取得すると安全です。
(TEXT 列にはこの方法が使えませんが)


(A案) Where row.Field(Of Integer?)("ID") = 1

(B案) Where If(row.Field(Of Integer?)("ID"), Integer.MinValue) = 1


A案は、DBNull を 0 として扱っています。
(「If Nothing = 1 Then」は「If 0 = 1 Then」の意味で解釈される)

B案は、DBNull を -2147483648 として扱っています。

引用返信 編集キー/
■60725 / inTopicNo.7)  Re[4]: DataTableを該当カラムの文字数でソートするには?
□投稿者/ ザキヤマ (4回)-(2011/07/16(Sat) 10:06:09)
shuさま、魔界の仮面弁士さま、ご回答ありがとうございました。
大変勉強になりました。
また、提示頂いたサイトで勉強します。
これにて解決とさせていただきます。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -