从列表c#中删除项目

本文关键字:删除项目 列表 | 更新日期: 2023-09-27 18:00:32

我在从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,因此我得到了一个超出范围的异常!

有人能帮我解决这个问题吗?为这个令人困惑的问题道歉,很难解释!感谢

从列表c#中删除项目

您可以使用Linq来完成。不确定是否需要转换为ListItem(您可以删除它)

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

找到匹配的值并将其从列表中删除后,您需要跳出内部循环来检查下一项。

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

你的嵌套是错误的,我想你想要的,

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();

这个怎么样:

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

RemoveAt后面放一个break语句,这样就不会再删除该项。

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