1

forループが1回だけループする理由が本当にわかりません。ロジックは正しいと思います。以下はコードです。

// the list is named 'dataList'

for(int i = 0 ; i < dataList.Count; i ++)
{
    string[] data = dataList[i].Split('+');
    string[] wsno = data[0].Split(':');
    if(wsno[1].Equals(tbWorkSheet.Text)) 
    {
        dataList.Remove(dataList[i])   <<<< remove string that has the same number
        //data removed
        //for loop ends up here idk why..
    }
}

dataList.Count はリストのサイズになります。

ケースはこのようなものです..リストに格納されている複数の文字列を削除したいのですが、各文字列にはグループ番号があります。したがって、for ループは最後のループまでループします。ただし、目的の番号と同じ番号の文字列が見つかった場合は、それを削除する if ステートメントを実行します。

4

6 に答える 6

6

これは非常に悪い考えです。このようにリストから値を削除すると、リスト内の次の項目にジャンプします。

たとえば、リストにインデックス 0、1、2 に 3 つのアイテムがあるとします。

最初の反復: i = 0 インデックス 0 のアイテムを削除します。リストにはインデックス 0、1 のアイテムが含まれます (最初のアイテムが削除されます)。

2 回目の繰り返し: i = 1. ここで、インデックス 1 にあるアイテムが 0 に移動する方法に注意してください。インデックス カウンターは 0 から 1 に移動します。したがって、このアイテムを「スキップ」します。

リストにアイテムが 2 つしかない場合、最初の削除後に壊れます。これは、インデックスが増加している間にカウントが減少するためです。

逆の順序に進むと、この問題が解消されます。

List<int> list = new List<int> { 2, 1 };
for (int i = list.Count - 1; i >= 0; i--)
{
    list.RemoveAt(i);
}

編集:Rawlingが言及しているように、アイテムを削除するときにカウンターを減らすと、先に進むことができます.

for (int i = 0; i < list.Count; i++)
{
    list.RemoveAt(i--);
}
于 2013-02-27T14:44:35.940 に答える
3

List.RemoveAll ジェネリック メソッドを使用できます。メソッドは、述語に一致するすべての項目を List から削除します。メソッドのシグネチャは次のとおりです。

int List.RemoveAll(述語一致)

削除された要素の数を返します。

MSDN を参照してください: http://msdn.microsoft.com/en-US/library/wdka673a(v=vs.110).aspx

于 2013-02-27T14:54:38.437 に答える
0

iアイテムを削除した後にデクリメントするのを忘れました。これにより、後続のすべてのアイテムの番号が 1 ずつ繰り下げられるため、次のアイテムがスキップされます。

于 2013-02-27T14:44:29.303 に答える
0

リストを逆方向にループします。

for(int i = dataList.Count; i >= 0 ; i--)
{
    string[] data = dataList[i].Split('+');
    string[] wsno = data[0].Split(':');
    if(wsno[1].Equals(tbWorkSheet.Text)) 
    {
        dataList.RemoveAt(dataList[i])   <<<< remove string that has the same number
        //data removed
        //for loop ends up here idk why..
    }
}
于 2013-02-27T14:46:01.200 に答える
0

元のコレクションを変更するよりも、新しいリストを作成することをお勧めします。

LINQ できちんと行うことができます。

dataList =
    dataList
        .Select(x => new{
            dataItem = x,
            secondWsno = x.Split('+').First().Split(':').Skip(1).First()
        })
        .Where(x => !x.secondWsno.Equals(tbWorkSheet.Text))
        .ToList();
于 2013-02-27T14:56:09.770 に答える
-5

for ループでリストを変更することはできません。削除するデータを別のリストに保持し、ループを終了した後に削除できます。

于 2013-02-27T14:44:26.370 に答える