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

わんくま同盟

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

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

ツリー一括表示

DataTableのビット判断方法 /カサス (18/08/02(Thu) 14:22) #88098
Re[1]: DataTableのビット判断方法 /魔界の仮面弁士 (18/08/02(Thu) 15:30) #88101
│└ Re[2]: DataTableのビット判断方法 /カサス (18/08/03(Fri) 11:01) #88115
│  └ Re[3]: DataTableのビット判断方法 /魔界の仮面弁士 (18/08/03(Fri) 11:44) #88119
Re[1]: DataTableのビット判断方法 /WebSurfer (18/08/02(Thu) 15:25) #88100


親記事 / ▼[ 88101 ] ▼[ 88100 ]
■88098 / 親階層)  DataTableのビット判断方法
□投稿者/ カサス (1回)-(2018/08/02(Thu) 14:22:41)

分類:[.NET 全般] 

C# を使用しています。

DataRow drw;
DataTable dt = new DataTable();
dt.Columns.Add("ID", typeof(int));
dt.Columns.Add("NAME", typeof(string));

ID NAME
1 A
2 B
3 AB
4 C

このようなデータがあったとします。

ID NAME
1 A
3 AB

を得るために
DataRow[] arraydrw = dt.Select("(ID AND 1) = 1");
のようにIDをビット判断してデータを取得する方法を教えてください。

[ □ Tree ] 返信 編集キー/

▲[ 88098 ] / ▼[ 88115 ]
■88101 / 1階層)  Re[1]: DataTableのビット判断方法
□投稿者/ 魔界の仮面弁士 (1758回)-(2018/08/02(Thu) 15:30:17)
No88098 (カサス さん) に返信
> DataRow[] arraydrw = dt.Select("(ID AND 1) = 1");
> のようにIDをビット判断してデータを取得する方法を教えてください。

Select メソッドではビット演算での絞り込みはできません。


// 案1: 剰余演算子で代用する
DataRow[] arraydrw = dt.Select("(ID % 2) = 1");

// 案2: LINQ で抽出する
DataRow[] arraydrw2 = dt.AsEnumerable().Where(r => (r.Field<int>("ID") & 1) == 1).ToArray();
[ 親 88098 / □ Tree ] 返信 編集キー/

▲[ 88101 ] / ▼[ 88119 ]
■88115 / 2階層)  Re[2]: DataTableのビット判断方法
□投稿者/ カサス (3回)-(2018/08/03(Fri) 11:01:34)
2018/08/03(Fri) 11:02:41 編集(投稿者)

ちなみになんですけど
力ずくですると以下のようになると思いますが、

DataTable dtnew = dt.Clone();
for(int inum = 0; inum < dt.Rows.Count; inum++)
{
 if (int.Prast(dt.Rows[inum]["ID"].ToString()) & 1 > 0) dtnew.ImportRow(dt.Rows[inum]);
}

LINQを使った
DataRow[] arraydrw2 = dt.AsEnumerable().Where(r => (r.Field<int>("ID") & 1) == 1).ToArray();
と比較して処理速度はどうなるのでしょうか?
[ 親 88098 / □ Tree ] 返信 編集キー/

▲[ 88115 ] / 返信無し
■88119 / 3階層)  Re[3]: DataTableのビット判断方法
□投稿者/ 魔界の仮面弁士 (1761回)-(2018/08/03(Fri) 11:44:03)
No88115 (カサス さん) に返信
> if (int.Prast(dt.Rows[inum]["ID"].ToString()) & 1 > 0) dtnew.ImportRow(dt.Rows[inum]);

スペルミスしていますし、括弧も足りていないような。

誤『if (int.Prast(dt.Rows[inum]["ID"].ToString()) & 1 > 0)』
正『if ((int.Parse(dt.Rows[inum]["ID"].ToString()) & 1) > 0)』



> 力ずくですると以下のようになると思いますが、

それだと元の行ではなく、複製された行が返されることになりますけれどね。

AsEnumerable<> は、既存行を取得してただ返却するだけですが、
ImportRow の場合は、新たに行を複製して、それが取り込まれているわけですから。



> LINQを使った
> DataRow[] arraydrw2 = dt.AsEnumerable().Where(r => (r.Field<int>("ID") & 1) == 1).ToArray();
> と比較して処理速度はどうなるのでしょうか?

ご自身の環境で試してみた結果はどうでしたか?
[ 親 88098 / □ Tree ] 返信 編集キー/

▲[ 88098 ] / 返信無し
■88100 / 1階層)  Re[1]: DataTableのビット判断方法
□投稿者/ WebSurfer (1573回)-(2018/08/02(Thu) 15:25:12)
No88098 (カサス さん) に返信

> DataRow[] arraydrw = dt.Select("(ID AND 1) = 1");
> のようにIDをビット判断してデータを取得する方法を教えてください。

「ビット判断」というのは C や C# 言語の & のようなビット AND のことを言ってますか?

フィルターには DataColumn クラスの Expression プロパティの値に適用する規則と同じ規則が
使用されるそうですが、その中にはないようです。

DataColumn.Expression プロパティ ← 日本語は機械翻訳なので英語で見てください
https://msdn.microsoft.com/ja-jp/library/system.data.datacolumn.expression(v=vs.110).aspx

質問者さんが書いた結果だけを見ると奇数の ID の列を取得していますが、それで良ければ % 演
算子は使えますので、dt.Select("(ID % 2)=1") で取得できます。

そうではなくて、どうしても C や C# 言語の & のようなビット AND でなければならないという
ことですか?

[ 親 88098 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -