从列表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,因此我得到了一个超出范围的异常!
有人能帮我解决这个问题吗?为这个令人困惑的问题道歉,很难解释!感谢
您可以使用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中循环。每个当前项目的项目。