如何在不超出范围的情况下从列表中删除多个条目?

8

我有一个整数列表,其中包含多个值(比如200个)。

List<int> ExampleList;

还有一个整数列表,其中包含需要从ExampleList中删除的索引。但是,这个列表没有排序。

List<int> RemoveFromExampleList;

如果它被排序了,我会运行一个反向循环并删除所有这样的值:
for (int i = (RemoveFromExampleList.Count-1); i >=0; i--)
{
    ExampleList.RemoveAt(RemoveFromExampleList[i]);
}

我需要对RemoveFromExampleList进行排序吗?或者有其他方法从ExampleList中删除不必要的值吗?

如果需要排序,最简单的方法是什么?是否有内置的C#库/方法可以排序?

6个回答

9
如果RemoveFromExampleList是一个索引列表,你需要按降序排序并基于这些索引进行删除。以其他方式进行操作会导致您删除不想删除的值。

2
没错。而且排序就像 RemoveFromExampleList.Sort(); 这么简单。如果你在后面加上 .Reverse(),你就可以通过列表进行 foreach - Heinzi
谢谢...这个有效!我感觉有点傻,竟然不知道List.Sort()的存在...哈哈。 - Ayush

4

这是一个简短的句子。

ExampleList.RemoveAll(x => RemoveFromExampleList.Contains(ExampleList.IndexOf(x)));

2

你可以用一个标志值来替换你要删除的值,也就是一个你知道在列表中不会出现的值,然后删除所有该值的出现。


1

你的选择是排序,没错。将移除列表按降序排序,然后按索引进行移除。

// perform an orderby projection, remove
foreach (int index in RemoveFromExampleList.OrderByDescending(i => i)
    ExampleList.RemoveAt(index);

或者

// actually sort the list, then remove
RemoveFromExampleList.Sort((a,b) => b.CompareTo(a));
foreach (int index in RemoveFromExampleList)
    ExampleList.RemoveAt(index);

(假设没有重复项,如果有,请在列表/投影上使用.Distinct()。)


0

如果你真的不喜欢对列表进行排序,你可以将列表变成可空整数列表:

List<int?> ints;

然后您可以将“删除列表”中的值置空,并使用RemoveAll方法删除空值。

但这显然有点像黑客行为。


0
你可以使用LINQ / Lambda来完成这个操作:
//示例:删除来自另一个列表的项目 List masterList = new List(); masterList.Add(1); masterList.Add(1); masterList.Add(2); masterList.Add(3);
        List<int> itemsToRemove = new List<int>();
        itemsToRemove.Add(1);
        itemsToRemove.Add(2);
        itemsToRemove.Add(3);

        List<int> cleanList = new List<int>();
        foreach (int value in itemsToRemove)
        {
            masterList = masterList.Where(x => x != value).ToList();
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接