0

文字列のリストを特定の値と比較したいだけです。これが私のコードです:

foreach (string s in myList)
            {
                int comp = String.Compare(s, line_to_delete);
                if (comp == 0)
                {
                    myList.Remove(s);
                }
            }

問題は、「comp == 1」を使用するたびに例外が発生しないことですが、文字列が同じかどうかを確認したい..

4

5 に答える 5

2

for代わりにループを使用します。

for (Int32 i = myList.Count - 1; i >= 0 i--)
{
    String s = myList[i];
    if (s.Equals(lineToDelete))
        myList.RemoveAt(i);
}

反復処理中にコレクションを変更することはできません。逆にループすることで、何かを削除するときにインデックスを無効にしないことが保証されます (複数の一致するエントリを削除する場合)。

別のオプション:

myList.RemoveAll(str => str.Equals(lineToDelete));
于 2013-09-17T19:19:29.697 に答える
2

コレクションを変更しようとしているため、例外が発生しています

myList.Remove(s);

foreachループで繰り返しているリストを変更することはできません。foreachを参照してください- MSDN

foreach ステートメントは、System.Collections.IEnumerable または System.Collections.Generic.IEnumerable(Of T) インターフェイスを実装する配列またはオブジェクト コレクション内の各要素に対して、埋め込みステートメントのグループを繰り返します。foreach ステートメントは、コレクションを反復処理して必要な情報を取得するために使用されますが、予期しない副作用を避けるために、ソース コレクションからアイテムを追加または削除するために使用することはできません。ソース コレクションからアイテムを追加または削除する必要がある場合は、for ループを使用します。

あなたの質問について:

問題は、「comp == 1」を使用するたびに例外が発生しないことです

それはチェックに合格せず、リストがそのまま残るためです。

string.Compare同等性をチェックしているように見えるので、なぜ を使用しているのかわかりません。

あなたは簡単に行うことができます:

myList = myList.Where(r=> r != line_to_delete).ToList();

string.Compare大文字と小文字を区別しない比較を実行できるように使用しようとしている場合は、大文字と小文字を区別しない比較にも列挙型を使用するstring.Equalsオーバーロードを探しStringComparisonます。

myList = myList
            .Where(r => r.Equals(line_to_delete, StringComparison.InvariantCultureIgnoreCase))
            .ToList();
于 2013-09-17T19:17:24.427 に答える
2

ループを反復するとforeach、反復子が台無しになるため、コレクションを変更できません。ループを使用するかfor、削除する文字列のリストを保持して、ループの終了後にそれらを削除しforeachます。

于 2013-09-17T19:18:00.870 に答える
0

述べたように、反復中にコレクションを変更しようとしているため、例外が発生しています。

これを行う方が良いでしょう:

//Remove single instance
var s = myList.FirstOrDefault(x => x.Equals(line_to_delete));
if (s != null)
    myList.Remove(s);

また

//Remove all instances 
myList = myList.Where(x => !x.Equals(line_to_delete)).ToList();
于 2013-09-17T19:23:33.483 に答える
0

列挙の整合性を保護するために、列挙しているコレクションの要素を変更することはできません。

代わりに for ループを使用できます。要素を削除するときは必ずインデックスを更新してください。そうしないと、間違った要素を操作することになり、最終的にインデックスの範囲外の例外が発生します。

for (int i = 0; i < myList.Length; i++)
{
    int comp = string.Compare(myList[i], line_to_delete);
    if (comp == 0)
    {
        myList.Remove(i);
        i--;
    }
}
于 2013-09-17T19:23:53.490 に答える