我在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 - 因此我得到超出范围的异常!
有人可以帮我解决这个问题吗?对这个令人困惑的问题抱歉,很难解释!感谢
答案 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。