删除基于索引c#的列表项

本文关键字:列表 索引 于索引 删除 | 更新日期: 2023-09-27 17:57:27

我有两个列表。第一个列表包含字母和数字等值。长度为[0]-[36]。第二个列表包含类似的值,长度也是[0]-[36]。

我用特定的值迭代第二个列表两次以获取索引键,当我从第二个名单中获取索引键时,我想根据第二个清单中的索引删除第一个名单中的项目。

问题是第二次迭代不起作用了,因为第一个列表中的索引键已经改变了。

我可能应该将列表转换为数组(数组有固定的索引键,列表在之后生成),但我不知道如何添加或删除数组中的索引键。

我不使用林克。

感谢您的帮助和建议BR

代码示例:

List<int> list_z = new List<int>();
List<int> list_k = new List<int>();
for (int i = 0; i < second_list.Count; i++) {
    if (second_list[i] == "K")
    {
    list_k.Add(i);
    }
}
int k = list_k.Count; 
for (int i = 0; i < k; i++) {
    first_list.RemoveAt(list_k[i]);
}
for (int i = 0; i < second_list.Count; i++)
{
    if (second_list[i] == "Z")
    {
    list_z.Add(i);
    }
}
int z = list_z.Count;
for (int i = 0; i < svi_z; i++)
    first_list.RemoveAt(lista_z[i]); //here is error, because first_list doesnt have index key number 36 anymore
}

删除基于索引c#的列表项

从基于索引的列表中删除项目时,应按降序删除它们(例如,应按此顺序删除第11、第8、第3d、第2个项目)。在您的情况下:

  list_k.Sort();
  for (int i = list_k.Count - 1; i >= 0; --i)
    first_list.RemoveAt(list_k[i]);

有一个简单的解决方案,可以一个接一个地从特定索引的列表中删除项目。也就是说,按降序排列索引,这样就不会在列表中移动任何项目。

示例:

下面抛出一个错误:

List<int> list = Enumerable.Range(0, 20).ToList();
List<int> indexesToRemove = new List<int>(){ 5, 13, 18 };
foreach(int i in indexesToRemove)
{
    list.RemoveAt(i);
}

而如果你这样做,你不会得到错误:

List<int> list = Enumerable.Range(0, 20).ToList();
List<int> indexesToRemove = new List<int>(){ 5, 13, 18 };
foreach(int i in indexesToRemove.OrderByDescending(x => x))
{
    list.RemoveAt(i);
}

因此,在您的情况下,只需要在循环之前调用list_z = list_z.OrderByDescending(x => x).ToList();,一切都会正常工作。

或者,如果您不想使用linq,您可以执行以下操作:

list_z.Sort((x, y) => y - x);
for (int i = 0; i < list_z.Count; i++)
    first_list.RemoveAt(lista_z[i]);
}

或者您可以简化您的操作:

        // Iterate and assign null
        for (var i = 0; i < second_list.Count(); i++)
        {
            if (second_list[i] == "K")
            {
                first_list[i] = null;
            }
        }
        // Iterate and assign null
        for (var i = 0; i < second_list.Count; i++)
        {
            if (second_list[i] == "Z")
            {
                first_list[i] = null;
            }
        }
        // remove nulls without linq or lambda
        first_list.RemoveAll(delegate (string o) { return o == null; });