質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

3回答

10142閲覧

Listの要素を減らす処理の書き方をしりたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2015/09/20 14:31

C#の質問です。
List<string>は、構成要素を増やしたり減らしたりできるので、配列よりもよく使っています。
List<string> items = new List<string>();
これで、itemsにたとえばりんごとぶどうを入れたとして、
foreach(string item in items){
if (item.Contains("ぶどう")){
//なにか処理
//もうそのitemsからはぶどうは使いたくないので削除したい。
items.Remove(item);
}
}
とすると、エラーになるのですが、こういうことって、よくありませんか?
使わないitemを減らしていく、というのをスマートにするには、どうするものなのでしょう?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

for文で逆順に走査しながら削除するのが良いのではないでしょうか。
これならば削除された要素にアクセスしてしまう心配は無いかと思います。

csharp

1for (int i = items.Count - 1; i >= 0; i--) { 2 if (items[i] == "ぶどう") { 3 items.Remove(items[i]); 4 } 5}

または、RemoveAllメソッドを使ってみるのも良いかと思います。

csharp

1items.RemoveAll(item => item == "ぶどう");

投稿2015/09/20 14:36

編集2015/09/20 14:40
hy3

総合スコア594

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

1.リストから「ぶどう」をフィルタして新しいリスト(「ぶどう」リスト)を作る。
2.新しいリスト(「ぶどう」リスト)を元に「なにか処理」を行う。
3.元のリストから「ぶどう」を一括削除する。

という風に処理するのはいかがですか?

投稿2015/09/22 00:08

umeaji

総合スコア101

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

処理をイメージしづらいので、バグを引き起こしやすくなるため、
『ループ処理の中でループ条件の要素数は変えてはダメ』

以下のプログラムを元に、どういう処理の流れとなるか見ていきます。

List<String> items = new List<string>(); items.Add("1.りんご"); items.Add("2.ぶどう"); items.Add("3.りんご"); foreach (string item in items) { if (item.Contains("ぶどう")) { items.Remove(item); } }

まず、foreach直前でリストの中身は↓のようになってます
イメージ説明
第1ループ目:要素の1番目「1.りんご」を取り出して、ぶどうか判定し、そうではないので何もせず次へ
イメージ説明
第2ループ目:要素の2番目「2.ぶどう」を取り出して、ぶどうが含まれるので、要素を削除。次へ
イメージ説明
第3ループ目:要素の3番目...要素が存在しないので例外発生
イメージ説明

という感じで、直感的に期待した処理をしてくれません。

この場合は、例えば下記のように、削除ではなく、
別の入れ物に残すものを入れるというやり方で、
ループ条件の要素数を変更しない実装が可能です。

List<String> items = new List<string>(); items.Add("1.りんご"); items.Add("2.ぶどう"); items.Add("3.りんご"); List<String> tmpList = new List<string>(); foreach (string item in items) { if (item.Contains("ぶどう") == false) { tmpList.Add(item); } } items = tmpList; foreach (string item in items) { Console.WriteLine(item); }

投稿2015/09/21 00:32

TetsujiMiwa

総合スコア1124

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問