Предполагая, что список элементов, подлежащих удалению, является относительно коротким, вы можете первым сортировать целевой список. Затем перейдите в исходный список и сохраните индекс в целевом списке, который соответствует удаляемому элементу.
Предполагается, что список источника 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);
}
Таким образом, у вас есть только 1 обход как haystack
и needle
, плюс время сортировки needle
, при условии, что удаление - O(1)
(что часто бывает для связанных списков и подобных коллекций). Если коллекция является List<...>
, удаление потребуется O(collection size)
из-за сдвигов данных, так что лучше начать с конца обеих коллекций и перейти к началу:
needle.Sort(); // not needed if it's known that `needle` is sorted
// haystack is known to be sorted
haystackIdx = haystack.Count - 1;
needleIdx = needle.Count - 1;
while (needleIdx >= 0 && haystackIdx >= 0)
{
if (haystack[haystackIdx] > needle[needleIdx])
haystackIdx--;
else if (haystack[haystackIdx] < needle[needleIdx])
needleIdx--;
else
haystack.RemoveAt(haystackIdx--);
}
Ваш список предметов, чтобы удалить отсортирован? – Vlad 2010-12-16 22:20:09