2012-04-16 4 views
7

いくつかの条件に一致する項目をリストから削除して、その項目を取得する最も簡単な方法はどれですか。LINQ:RemoveAllとget要素を削除しました

私はいくつかの方法で考えることができ、私は最高の一つであるかわからない:

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

私はあなたが最初のリストをマテリアライズする必要があり、またはあなたが次の行に選択しようとしている非常にアイテムを失うノートで、読みやすさのために、最初のオプションとなるだろう:

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

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

編集:あなたの最後の例を読んだので、今すぐ書かれているように、他のすべての項目が取り出されることに注意してください。削除後にi+1番目の要素がi番目の要素になり、iを増やすと、その要素をスキップしているため、条件チェックがなくなり、削除行が実際にlist.RemoveAt(i--);になるはずです。

+0

それは実際にはO(n^3)のですが、私はマテリアの欠如はちょうどあなたの心を滑っと仮定しています。 – Blindy

+0

) 2番目の命令でサブリストから項目を削除しますか? :O – Diego

+0

あなたは 'サブリスト 'から絶対に削除しないでください。また、正しく読んでも意味がありません。 – Blindy

2

私は機能プログラミングアプローチ(新しいものを作るだけで、既存のものは変更しないでください)を使うのが好きです。 ToLookupのメリットの1つは、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]); 
+0

私はそれがずっと複雑だと思っています。これにはどんな利点がありますか? – Diego

+0

条件はアイテムごとに1回だけ評価されます。リストインスタンスは変更されません。これは、そのリストインスタンスがスレッド間で共有される場合に大きな利点になります。 –

関連する問題