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

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

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

Re[7]: DataTableの次の行について


(過去ログ 17 を表示中)

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

■6685 / inTopicNo.1)  DataTableの次の行について
  
□投稿者/ やまいも (9回)-(2007/08/22(Wed) 11:10:34)

分類:[VB.NET/VB2005] 

お世話になります。
環境はXP、VB2005になります。
DataTable内をループで回し、If文条件にあうものをRemoveAtで削除しています。
削除はできるのですが、ループでまわしていると行がありませんとエラーがでます。
ループ数が多いんだと思います。そこでDataTableの次の行がないときループを抜けるという処理を入れようと思うのですが、IfでDataTableの次の行がないというのはどういう処理を記述すればよいのかわかりません。
ご教授下さい。
引用返信 編集キー/
■6686 / inTopicNo.2)  Re[1]: DataTableの次の行について
□投稿者/ Ri (2回)-(2007/08/22(Wed) 11:33:45)
for (int i = 0; i < dtRows.Count; i++)
{
if (条件)
{
dt.Rows.RemoveAt(i);
i--;    //ごれが抜けてるんじゃないでしょか。
} 
}
引用返信 編集キー/
■6687 / inTopicNo.3)  Re[2]: DataTableの次の行について
□投稿者/ HIRO (107回)-(2007/08/22(Wed) 11:37:49)
HIRO さんの Web サイト
行を削除するのですから、Rows.Countの値が、削除するたびに減っていくことに注意した方が良いですね。
引用返信 編集キー/
■6689 / inTopicNo.4)  Re[3]: DataTableの次の行について
□投稿者/ やまいも (10回)-(2007/08/22(Wed) 11:48:05)
No6687 (HIRO さん) に返信
ありがとうございます。見事に解決しました。
i--の記述を入れていませんでした。
解決済み
引用返信 編集キー/
■6690 / inTopicNo.5)  Re[4]: DataTableの次の行について
□投稿者/ 特攻隊長まるるう (80回)-(2007/08/22(Wed) 11:54:46)
No6689 (やまいも さん) に返信
> ■No6687 (HIRO さん) に返信
> ありがとうございます。見事に解決しました。
> i--の記述を入れていませんでした。
んん。。本当に理解して解決?

>そこでDataTableの次の行がないときループを抜けるという処理を入れようと思うのですが
この方法ではバグが残ります。
それが理解できましたか?

解決済み
引用返信 編集キー/
■6693 / inTopicNo.6)  Re[5]: DataTableの次の行について
□投稿者/ やまいも (11回)-(2007/08/22(Wed) 12:06:56)
No6690 (特攻隊長まるるう さん) に返信
理解というより参考にさせてもらったという感じです。
そのまま使ったのではなくあくまで参考です。
ループの中で削除し、削除をすればi--をし、Rows.Countとiがイコールになればループを抜けるという処理をして解決です。
解決済み
引用返信 編集キー/
■6697 / inTopicNo.7)  Re[6]: DataTableの次の行について
□投稿者/ ぽぴ王子 (257回)-(2007/08/22(Wed) 12:53:46)
ぽぴ王子 さんの Web サイト
No6693 (やまいも さん) に返信

> 理解というより参考にさせてもらったという感じです。
> そのまま使ったのではなくあくまで参考です。

だ か ら こ そ
まるるうさんはこのように書いているのだと思います。

> んん。。本当に理解して解決?

私もまるるうさんに激しく同意。
なにもこの話だけじゃないのだと思いますよ。
理解した上で「自分だったらこうするぜ!」と参考にするのならかまわないのですけど
どうもなんだかわからないけどこっちの方が良さそうだからちょっと参考にしてコネコネ
して作っちゃえ!的なイメージがあるんですよ。
なので心配。


自分だったら…

for (int i = dtRows.Count-1; i >= 0; i--)
{
    if (条件)
    {
        dt.Rows.RemoveAt(i);
    }
}

こんな感じにするかな。
ループの中でループカウンタに手を入れるのは避けたいです(なんとなく)。

解決済み
引用返信 編集キー/
■6700 / inTopicNo.8)  Re[7]: DataTableの次の行について
□投稿者/ 特攻隊長まるるう (81回)-(2007/08/22(Wed) 13:17:23)
2007/08/22(Wed) 14:29:11 編集(投稿者)

No6697 (ぽぴ王子 さん) に返信
ん。。。もちろん、怒ってるわけではないですし、なんとなくの理解でも問題がなさそうな
質問ならつっこみはいれません。解決してるのを引き伸ばしてるのには理由があります。
バグが残りやすい部分だからです。どこでバグが残りやすいか分かってますか?と確認
したいだけです。

>ループの中で削除し、削除をすればi--をし、Rows.Countとiがイコールになればループを抜けるという処理をして解決です。
うん、プログラム自体はそうなんだけど、実際の動きで問題となる2点が理解できている
かどうか?が重要です。
1点目は、削除されたアイテム数だけインデックスがずれるということ。
2点目は、ずれたインデックスでループを回すとループ処理が実行されないアイテムが
できるということ。

コードで i-- を入れれば。。。という理解ではなくて、例えばうまくいかなかった時点で
以下のような動きを紙に書いて、どこに問題があるか見つけられるか?ということ。

(index)アイテム名
------------------------------
 (0)アイテム0
 (1)アイテム1
 (2)アイテム2
 (3)アイテム3

ループカウント(0)
 (0)アイテム0<チェック(削除条件満たさずそのまま)
 (1)アイテム1
 (2)アイテム2
 (3)アイテム3

ループカウント(1)
 (0)アイテム0
 (1)アイテム1<チェック(削除条件満たす)
 (2)アイテム2
 (3)アイテム3

ループカウント(1)(アイテム1削除)
 (0)アイテム0
 (1)アイテム2
 (2)アイテム3

ループカウント(2)
 (0)アイテム0
 (1)アイテム2
 (2)アイテム3<チェック

※アイテム2がチェックされていない

削除後にインデックスを減らす処理で同じような図を書いて、
問題点が解決されていることを確かめてください。
>そこでDataTableの次の行がないときループを抜けるという処理を入れようと思うのですが
この方法ではバグが残りますよね?。。。理解できましたか?

# 分類が[VB.NET/VB2005]だけどC#も分かるんだよね?
>  for (int i = 0; i < dtRows.Count; i++)
毎回、dtRows.Count が評価しなおされるなら正常に処理できます。これが
  intCount = dtRows.Count
  for (int i = 0; i < intCount; i++)
のような動きではだめです。

処理系によってはあるのですよ。ループの終了条件が初回のみ評価されて
2回目以降にループ内で変更した値が反映されないのが。
↓ちょうどこんな質問を見つけました。
http://rucio.bbs.coocan.jp/?m=listthread&t_id=13&summary=on

ま、その場合は
(1)ループカウンタとは別に削除したアイテム数を変数に覚えておいて、ループ内の
処理でループカウンタから削除したアイテム数分引いたインデックスを持つアイテム
に対して処理をする。
↑これならループカウンタには変更を加えず、先頭から処理できます。

ちょっと頭を使えば、インデックスが変更されるのは削除したアイテムより
後ろのアイテムのみだから、
(2)リストの最後からループを逆に回す。(ぽぴ王子さんの方法)

などがあるということです。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -