リストを繰り返し処理しているときにRemove
orを使用することは、意図的に困難にされています。巧妙なトリックで動作させることができるかもしれませんが、非常に遅くなります。呼び出すたびに、リスト全体をスキャンして、削除する要素を見つける必要があります。呼び出すたびに、後続の要素を 1 位置左に移動する必要があります。そのため、またはを使用する解は、二次時間O(n²)を必要とします。RemoveAt
Remove
RemoveAt
Remove
RemoveAt
可能であれば使用RemoveAll
してください。それ以外の場合、次のパターンは線形時間O(n)でリストをその場でフィルター処理します。
// Create a list to be filtered
IList<int> elements = new List<int>(new int[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10});
// Filter the list
int kept = 0;
for (int i = 0; i < elements.Count; i++) {
// Test whether this is an element that we want to keep.
if (elements[i] % 3 > 0) {
// Add it to the list of kept elements.
elements[kept] = elements[i];
kept++;
}
}
// Unfortunately IList has no Resize method. So instead we
// remove the last element of the list until: elements.Count == kept.
while (kept < elements.Count) elements.RemoveAt(elements.Count-1);