我真的不知道为什么for循环只循环一次。我认为逻辑是正确的,下面是代码。
// the list is named 'dataList'
for(int i = 0 ; i < dataList.Count; i ++)
{
string[] data = dataList[i].Split('+');
string[] wsno = data[0].Split(':');
if(wsno[1].Equals(tbWorkSheet.Text))
{
dataList.Remove(dataList[i]) <<<< remove string that has the same number
//data removed
//for loop ends up here idk why..
}
}
dataList.Count将是列表的大小。
案件是这样的.. 我想删除存储在列表中的多个字符串,每个字符串都有其组号。 因此,for循环将循环直到最后一个循环。但是当它找到一个与所需数字相同的数字的字符串时,它将执行if语句以删除它。
答案 0 :(得分:6)
这是一个非常糟糕的主意。通过从列表中删除值,您将跳过列表中的下一个项目。
例如,列表中的索引0,1,2中有3个项目。
第一次迭代:i = 0 您删除索引0处的项目。列表现在具有索引0,1处的项目(已删除第一项)。
第二次迭代:i = 1。 请注意这里位于索引1的项目如何移动到0.当我们的索引计数器从0变为1.所以我们将“跳过”此项。
如果您的列表中只有2个项目,他将在第一次删除后中断。这是因为在索引增加时计数会减少。
通过反向顺序,您将消除此问题。
List<int> list = new List<int> { 2, 1 };
for (int i = list.Count - 1; i >= 0; i--)
{
list.RemoveAt(i);
}
修改:正如罗林所提到的,如果您在删除项目时减少了计数器,则可以继续。
for (int i = 0; i < list.Count; i++)
{
list.RemoveAt(i--);
}
答案 1 :(得分:3)
您可以使用List.RemoveAll泛型方法。方法从列表中删除与谓词匹配的所有项目。 方法签名如下:
int List.RemoveAll(Predicate match)
它返回已删除的元素数。
请参阅MSDN:http://msdn.microsoft.com/en-US/library/wdka673a(v=vs.110).aspx
答案 2 :(得分:0)
删除项目后,您忘记减少i
。这将跳过下一个项目,因为所有后续项目都将重新编号为1。
答案 3 :(得分:0)
在列表中向后循环:
for(int i = dataList.Count; i >= 0 ; i--)
{
string[] data = dataList[i].Split('+');
string[] wsno = data[0].Split(':');
if(wsno[1].Equals(tbWorkSheet.Text))
{
dataList.RemoveAt(dataList[i]) <<<< remove string that has the same number
//data removed
//for loop ends up here idk why..
}
}
答案 4 :(得分:0)
我更喜欢制作一个新列表而不是修改原始集合。
可以用LINQ整洁地完成:
dataList =
dataList
.Select(x => new{
dataItem = x,
secondWsno = x.Split('+').First().Split(':').Skip(1).First()
})
.Where(x => !x.secondWsno.Equals(tbWorkSheet.Text))
.ToList();
答案 5 :(得分:-5)
您无法更改for循环中的列表。 您可以在另一个列表中保存要删除的数据,然后在退出循环后将其删除。