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

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

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

Re[1]: DataTableのビット判断方法


(過去ログ 151 を表示中)

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

■88098 / inTopicNo.1)  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をビット判断してデータを取得する方法を教えてください。

引用返信 編集キー/
■88100 / inTopicNo.2)  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 でなければならないという
ことですか?

引用返信 編集キー/
■88101 / inTopicNo.3)  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();
引用返信 編集キー/
■88115 / inTopicNo.4)  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();
と比較して処理速度はどうなるのでしょうか?
引用返信 編集キー/
■88119 / inTopicNo.5)  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();
> と比較して処理速度はどうなるのでしょうか?

ご自身の環境で試してみた結果はどうでしたか?
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -