C# 什么';从有序集合中删除项目的最佳方法是什么?

C# 什么';从有序集合中删除项目的最佳方法是什么?,c#,collections,html-lists,C#,Collections,Html Lists,我有一个要从C#中的有序集合中删除的项目列表 最好的办法是什么 如果删除中间的一个项目,索引会发生变化,但是如果我想删除多个项目,如果避免索引变化,从结尾开始,向后返回索引0。 大致如下: for(int i = myList.Count - 1; i >= 0; i++) { if(NeedToDelete(myList[i])) { myList.RemoveAt(i); } } 要避免索引更改,请从末尾开始,然后返回索引0 大致如下: fo

我有一个要从C#中的有序集合中删除的项目列表

最好的办法是什么


如果删除中间的一个项目,索引会发生变化,但是如果我想删除多个项目,如果避免索引变化,从结尾开始,向后返回索引0。 大致如下:

for(int i = myList.Count - 1; i >= 0; i++) 
{
    if(NeedToDelete(myList[i]))
    {
        myList.RemoveAt(i);
    }
}

要避免索引更改,请从末尾开始,然后返回索引0

大致如下:

for(int i = myList.Count - 1; i >= 0; i++) 
{
    if(NeedToDelete(myList[i]))
    {
        myList.RemoveAt(i);
    }
}

收藏的类型是什么?如果它继承自,则只需在要删除的项列表上运行一个循环,然后对集合调用
.remove()
方法

例如:

object[] itemsToDelete = GetObjectsToDeleteFromSomewhere();
ICollection<object> orderedCollection = GetCollectionFromSomewhere();

foreach (object item in itemsToDelete)
{
    orderedCollection.Remove(item);
}
object[]itemsToDelete=GetObjectsToDeleteFromSomewhere();
ICollection orderedCollection=GetCollectionFromSomewhere();
foreach(itemsToDelete中的对象项)
{
orderedCollection.Remove(项目);
}

收藏的类型是什么?如果它继承自,则只需在要删除的项列表上运行一个循环,然后对集合调用
.remove()
方法

例如:

object[] itemsToDelete = GetObjectsToDeleteFromSomewhere();
ICollection<object> orderedCollection = GetCollectionFromSomewhere();

foreach (object item in itemsToDelete)
{
    orderedCollection.Remove(item);
}
object[]itemsToDelete=GetObjectsToDeleteFromSomewhere();
ICollection orderedCollection=GetCollectionFromSomewhere();
foreach(itemsToDelete中的对象项)
{
orderedCollection.Remove(项目);
}

如果集合是一个
列表
,也可以使用以下方法:


如果集合是
列表
,也可以使用以下方法:


假设要删除的项目列表相对较短,可以首先对目标列表进行排序。然后遍历源列表,并在目标列表中保留一个与您删除的项相对应的索引

假设源列表为
haystack
,要删除的项目列表为
needle

needle.Sort(); // not needed if it's known that `needle` is sorted
// haystack is known to be sorted
haystackIdx = 0;
needleIdx = 0;
while (needleIdx < needle.Count && haystackIdx < haystack.Count)
{
    if (haystack[haystackIdx] < needle[needleIdx])
        haystackIdx++;
    else if (haystack[haystackIdx] > needle[needleIdx])
        needleIdx++;
    else
        haystack.RemoveAt(haystackIdx);
}

假设要删除的项目列表相对较短,可以首先对目标列表进行排序。然后遍历源列表,并在目标列表中保留一个与您删除的项相对应的索引

假设源列表为
haystack
,要删除的项目列表为
needle

needle.Sort(); // not needed if it's known that `needle` is sorted
// haystack is known to be sorted
haystackIdx = 0;
needleIdx = 0;
while (needleIdx < needle.Count && haystackIdx < haystack.Count)
{
    if (haystack[haystackIdx] < needle[needleIdx])
        haystackIdx++;
    else if (haystack[haystackIdx] > needle[needleIdx])
        needleIdx++;
    else
        haystack.RemoveAt(haystackIdx);
}


你要删除的项目列表是否已排序?你要删除的项目列表是否已排序?我想她指的是从你要删除的最后一项开始,然后向上。@BeemerGuy:我添加了一个代码示例来说明我的意思。哦,好的,我以为OP提前知道索引。@BeemerGuy:是的,从这个问题上讲有点难。我也不确定我的解释是否正确。再补充一句——我想她的意思是从你要删除的最后一项开始,然后向上。@BeemerGuy:我添加了一个代码示例来说明我的意思。哦,好吧,我以为OP提前知道了索引。@BeemerGuy:是的,从这个问题上讲有点难。我也不确定我的解释是否正确。只有从末尾开始按索引,或者保存要删除到数组中的索引或其他内容。对集合执行foreach并同时对其调用Remove()将引发异常。请参见我的示例。如果您在另一个数组上循环,并且希望从其他集合中删除这些项,这将很好地工作。我就是这样理解这个问题的。也许我误解了。@Anna——他并没有从他正在迭代的集合中删除,所以在这里不会发生异常。这里是迭代要删除的项。这是非常低效的,因为您几乎是在复制这些项。@BeemerGuy:我的评论是在示例出现之前写的@凯尔:啊,有道理。我以为你的意思是把原来的收藏品翻过来。我读错了。只有当你从末尾开始索引,或者保存要删除到数组中的索引或其他东西时。对集合执行foreach并同时对其调用Remove()将引发异常。请参见我的示例。如果您在另一个数组上循环,并且希望从其他集合中删除这些项,这将很好地工作。我就是这样理解这个问题的。也许我误解了。@Anna——他并没有从他正在迭代的集合中删除,所以在这里不会发生异常。这里是迭代要删除的项。这是非常低效的,因为您几乎是在复制这些项。@BeemerGuy:我的评论是在示例出现之前写的@凯尔:啊,有道理。我以为你的意思是把原来的收藏品翻过来。我看错了。不幸的是,它不是IList,而是ICollection。不幸的是,它不是IList,而是ICollection