人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

VB6.0のCollectionについて質問です。
VB初心者なんですが回りにあまり経験者がいないのと
サンプルになりそうなコードがないため一般的にこのような場合どう書けばいいのか教えてください。
以下のソースのようにCollectionの中の配列(実際のソースはプロパティクラスなんですが)の
ある項目にある値が含まれていればCollectionから削除という風に書きたいのです。
ただ今のソースだとループの中で削除しているのでCollectionのインデックスサイズが変わってエラーになります。
普通こういう場合どう書くのが一般的ですか?
強引に書けばいくらでもやりようがありますが一般的な方法が知りたくて質問しました。
そもそもループなど必要なかったりしてもイヤなので…。

Dim test As Collection
Dim str(2) As String
Dim val As Variant

Set test = New Collection

str(0) = "1"
str(1) = "2"
test.Add (str)

str(0) = "2"
str(1) = "3"
test.Add (str)

str(0) = "1"
str(1) = "4"
test.Add (str)


For i = 1 To test.Count
val = test.Item(i)
If (val(0)) = "1" Then
test.Remove (i)
End If
Next

●質問者: matttsu
●カテゴリ:コンピュータ
✍キーワード:ADD as NeXT SET STR
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● きゃづみぃ
●20ポイント

ループの中で やるとダメな場合は、ループの中で フラグをたてておいて

ループが 終わってから、そのフラグで判断して処理をしたらいいと思います。

一般的な方法は、エラーが出なければそれでいいと思います。

あと副作用もないやり方ですね。

http://q.hatena.ne.jp/list


2 ● TONTON3
●30ポイント

http://q.hatena.ne.jp/answer

現在のItem数が可変になる可能性があるので

こんな処理になるなぁ

i = 1

do

val = test.Item(i)

If (val(0)) = "1" Then

test.Remove (i)

i = 1

Else

i = i + 1

End If

if i < test.Count then

exit do

end if

loop


3 ● KirakiraHikaru
●30ポイント ベストアンサー

ループ内で削除する必要がある場合は、

Indexの影響を避けるために、逆方向でループしてください。


コレクションのループ処理

http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja...

 size = colMsgs.Count
 For i = 1 to size
 Set objMsg = colMsgs.Item(size - i + 1)
 If objMsg.TimeExpired <= Now Then
 objMsg.Delete
 End If
 Next i

もしくは下記のようにマイナスステップ

For i = colMsgs.Count - 1 To 0 Step -1
◎質問者からの返答

マイナスステップが一番簡単そうですね。

他の方もいろいろやり方を教えてもらいありがとうございます。

それぞれなるほどと思えて勉強になりました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ