根据索引删除列表项 C#
remove list item based on index c#
我有两个列表。
第一个列表包含字母和数字等值。
长度为[0]-[36]。
第二个列表包含相似的值,长度也是 [0]-[36].
我用特定值迭代第二个列表两次以获取索引键,当我从第二个列表中获取索引键时,我想根据第二个列表中的索引删除第一个列表中的项目。
问题是第二次迭代不再起作用,因为第一个列表中的索引键已更改。
我可能应该将列表转换为数组(数组具有固定的索引键,之后生成列表)但我不知道如何从数组中添加或删除索引键。
我不使用 Linq。
感谢您的帮助和建议
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
}
根据索引从列表中删除项目时,您应该按降序删除它们(例如,您应该删除第 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; });
我有两个列表。 第一个列表包含字母和数字等值。 长度为[0]-[36]。 第二个列表包含相似的值,长度也是 [0]-[36].
我用特定值迭代第二个列表两次以获取索引键,当我从第二个列表中获取索引键时,我想根据第二个列表中的索引删除第一个列表中的项目。
问题是第二次迭代不再起作用,因为第一个列表中的索引键已更改。
我可能应该将列表转换为数组(数组具有固定的索引键,之后生成列表)但我不知道如何从数组中添加或删除索引键。
我不使用 Linq。
感谢您的帮助和建议 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
}
根据索引从列表中删除项目时,您应该按降序删除它们(例如,您应该删除第 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; });