1

コンボボックスからさらにアイテムを削除しようとしていますが、アプリケーションは一度に1つのアイテムしか削除していません。

comboboxにはメールアドレスのリストがあります。空のアイテムとテキスト内に("")ないアイテムを削除したい。@

以下のコードは、一度に1つのアイテムのみを削除します。

    for (int i = 0; i < cmbTo.Items.Count; i++)
    {
        string st = cmbTo.Items[i].ToString();
        if (st == "" || st.IndexOf("@") == -1)
        {               
            cmbTo.Items.RemoveAt(i);                    
        }
    }

どうすればこれを書き直すことができますか?

4

4 に答える 4

3

iヒント:アイテムを削除すると、変数がどうなるかを考えてください

..。

アイテムをRemoveAtすると、そのアイテムは削除され、後続のすべてのアイテムは1つのインデックスを上に移動します。次に、ループが下部に到達し、そこで上部に戻り、増分して次に進みますi

結果?アイテムをスキップしました。これがリストの最後の項目である場合、ループが存在します。

代わりに、手動でデクリメントiして削除を相殺し、すべてが機能するようにします。

for (int i = 0; i < cmbTo.Items.Count; i++)
{
    string st = cmbTo.Items[i].ToString();
    if (st == "" || st.IndexOf("@") == -1)
    {               
        cmbTo.Items.RemoveAt(i);
        i--;
    }
}
于 2013-03-18T21:27:09.543 に答える
3

コレクションからアイテムを削除すると、Count()が減少し、すべてのアイテムのリストを通過する前にforループが終了するため、コードは機能しません。

最初に削除する要素のリストを作成し(それらを一時リストに入れます)、次に新しく作成されたリストを呼び出して繰り返す必要がありますcmbTo.Items.Remove(currentElement);

于 2013-03-18T21:24:48.373 に答える
2

コンボボックスからアイテムを削除すると、次のアイテムのインデックスが変更され、アイテム数が変更されます。それはあなたが見ている行動を説明できますか?

于 2013-03-18T21:26:40.980 に答える
1

反対方向(つまり、端から前)に削除するだけで、アイテムを削除するときにi1を調整する必要はありません。

var items = cmbTo.Items;
int i = items.Count;
while (i > 0) {
    --i;
    string st = items[i].ToString();
    if (st == "" || st.IndexOf("@") < 0)
        items.RemoveAt(i);
}

1現在行っていないため、削除される可能性のある一部のアイテムがスキップされ、問題が発生します。

于 2013-03-18T21:40:11.993 に答える