12

これは、リストから特定の条件に一致するアイテムを削除してから、それらのアイテムを取得する最も簡単な方法です。

いくつかの方法で考えることができますが、どれが最適かはわかりません。

var subList = list.Where(x => x.Condition);
list.RemoveAll(x => x.Condition);

また

var subList = list.Where(x => x.Condition);
list.RemoveAll(x => subList.Contains(x));

これは最良の方法の1つですか?もしそうなら、どれですか?そうでない場合、どうすればよいですか?

4

4 に答える 4

8

私は関数型プログラミング アプローチを使用するのが好きです (新しいものだけを作成し、既存のものを変更しないでください)。の利点の 1 つToLookupは、項目の 2 方向の分割以上を処理できることです。

ILookup<bool, Customer> lookup = list.ToLookup(x => x.Condition);
List<Customer> sublist = lookup[true].ToList();
list = lookup[false].ToList();

または、元のインスタンスを変更する必要がある場合...

list.Clear();
list.AddRange(lookup[false]);
于 2012-04-16T17:54:16.377 に答える
5

読みやすさのために最初のオプションを使用します。最初にリストを具体化する必要があることに注意してください。そうしないと、次の行で選択しようとしているアイテムが失われます。

var sublist = list.Where(x => x.Condition).ToArray();
list.RemoveAll(x => x.Condition);

2 番目の例は理由もなく O(n^2) であり、最後の例はまったく問題ありませんが、読みにくくなっています。

編集:最後の例を読み直したので、今書かれているように、他のすべてのアイテムが削除されることに注意してください。条件チェックが欠落しており、削除後に th要素が th 要素になり、インクリメントするとそれをスキップするlist.RemoveAt(i--);ため、削除行が実際にあるはずです。i+1ii

于 2012-04-16T17:09:38.513 に答える