1

我真的不知道为什么 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 语句来删除它。

4

6 回答 6

6

这是一个非常糟糕的主意。通过像这样从列表中删除值,您将跳过列表中的下一个项目。

例如,您的列表中有 3 个项目位于索引 0、1、2 处。

第一次迭代: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);
}

编辑:正如Rawling提到的,如果在删除项目时减少计数器,您可以继续前进。

for (int i = 0; i < list.Count; i++)
{
    list.RemoveAt(i--);
}
于 2013-02-27T14:44:35.940 回答
3

您可以使用 List.RemoveAll 泛型方法。方法从 List 中删除与谓词匹配的所有项目。方法签名如下:

int List.RemoveAll(谓词匹配)

它返回已删除的元素数。

请参阅 MSDN: http: //msdn.microsoft.com/en-US/library/wdka673a (v=vs.110).aspx

于 2013-02-27T14:54:38.437 回答
0

i删除项目后您忘记递减。这将跳过下一个项目,因为所有后续项目都将被重新编号为 1。

于 2013-02-27T14:44:29.303 回答
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..
    }
}
于 2013-02-27T14:46:01.200 回答
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();
于 2013-02-27T14:56:09.770 回答
-5

您不能在 for 循环中更改列表。您可以将要删除的数据保存在另一个列表中,然后在退出循环后将其删除。

于 2013-02-27T14:44:26.370 回答