从列表中删除项目c#

时间:2013-02-21 22:33:05

标签: c# list

我在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);
            }
        }
    }

代码的目的是将列表框中的现有项目与新添加的项目进行比较,以便我知道刚刚添加了哪些项目。因此,目前我从数据库中获取当前列表框项目(它们存储在此处,它是数据绑定列表框),将这些项目输入到列表中,并为每个列表项目,将它们与列表框中的项目进行比较,如果匹配,请从列表中删除该项目。

因此,最后,如果我添加两个新条目,列表应该只存储两个新添加的值。

代码不起作用,因为第一项被删除了,但是,i的值大于current.count - 因此我得到超出范围的异常!

有人可以帮我解决这个问题吗?对这个令人困惑的问题抱歉,很难解释!感谢

6 个答案:

答案 0 :(得分:8)

你可以用Linq做到。不确定是否需要转换为ListItem(可以删除它)

current.RemoveAll(x => sp_list.Items.Cast<ListItem>()
                              .Any(li => li.Text == x.uname));

答案 1 :(得分:3)

找到匹配值并将其从列表中删除后,您需要突破内循环以检查下一个项目。

        if (li.Text == current[i].uname)
        {
            current.RemoveAt(i);
            break;
        }

答案 2 :(得分:3)

这个怎么样:

foreach (ListItem li in sp_list.Items) {
    if (current.Contains(li.Text)) {
        current.Remove(li.Text);
    }
}

答案 3 :(得分: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();

答案 4 :(得分:0)

break后面添加RemoveAt语句,这样您就不会再删除该项目了。

答案 5 :(得分:0)

您可以按相反顺序旅行列表,并使用RemoveAt(i)删除项目。 为了提高效率,您可能希望将ListItem文本放在Set中,这样您就不必为每个当前项循环sp_list.Items。