0

C#のリストからアイテムを削除するのに問題があります。私の現在のコードは以下の通りです:

for (int i = current.Count - 1; i >= 0; i--)
    {
        foreach (ListItem li in sp_list.Items)
        {
            if (li.Text == current[i].uname)
            {
                current.RemoveAt(i);
            }
        }
    }

このコードの目的は、リストボックス内の既存のアイテムを新しく追加されたアイテムと比較して、追加されたばかりのアイテムを確認することです。そのため、現在、データベースから現在のリストボックスアイテムを取得し(ここに格納されています。これはデータバインドされたリストボックスです)、これらをリストに入力し、リストアイテムごとに、リストボックス内のアイテムと比較します。それらが一致する場合は、リストからアイテムを削除します。

したがって、最終的に、2つの新しいエントリを追加すると、リストには2つの新しく追加された値のみが格納されます。

最初の項目が正常に削除されたため、コードは機能しませんが、iの値がcurrent.countより大きいため、範囲外の例外が発生します。

誰かがこの問題で私を助けることができますか?紛らわしい質問についてお詫びします、説明するのは難しいです!ありがとう

4

6 に答える 6

8

Linqでそれを行うことができます。ListItemへのキャストが必要かどうかわからない(削除できます)

current.RemoveAll(x => sp_list.Items.Cast<ListItem>()
                              .Any(li => li.Text == x.uname));
于 2013-02-21T22:37:35.867 に答える
3

あなたの入れ子は間違っています、私はあなたが望んでいたと思います、

foreach (ListItem li in sp_list.Items)
{
    for (int i = current.Count - 1; i >= 0; i--)
    {
        if (li.Text == current[i].uname)
        {
            current.RemoveAt(i);
        }
    }
}

または、linqを使用します。

// For lookup performance.
var items = new HashSet(sp_list.Items.Select(i => i.text));

current = current.Where(c => !items.Contains(c.uname)).ToList();
于 2013-02-21T22:41:55.767 に答える
3

一致する値を見つけてリストから削除したら、内側のループから抜け出して次の項目を確認します。

        if (li.Text == current[i].uname)
        {
            current.RemoveAt(i);
            break;
        }
于 2013-02-21T22:40:17.520 に答える
3

これはどう:

foreach (ListItem li in sp_list.Items) {
    if (current.Contains(li.Text)) {
        current.Remove(li.Text);
    }
}
于 2013-02-21T22:40:49.343 に答える
0

リストを逆の順序で移動し、RemoveAt(i)を使用してアイテムを削除できます。また、効率を上げるために、ListItemテキストをセットに入れて、現在の各アイテムのsp_list.Itemsをループする必要がないようにすることもできます。

于 2013-02-21T22:44:05.773 に答える
0

そのアイテムを再度削除しないように、後にbreakステートメントを配置します。RemoveAt

于 2013-02-21T22:41:02.570 に答える