C# と VB.NET の質問掲示板
ASP.NET、C++/CLI、Java 何でもどうぞ
C# と VB.NET の入門サイト
Re[1]: DataTableのビット判断方法
(過去ログ 151 を表示中)
掲示板トップ
C# と VB.NET 入門
新規作成
利用方法/規約
トピック表示
ランキング
記事検索
過去ログ
[トピック内 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
-