2008-08-19 10 views
2

ASP.NETは、特定の条件に一致したときにのみ、リストから項目を削除する必要があるシナリオになったときに制御します。リストからN個の項目を条件付きで削除する

ジェネリックListクラスのRemoveAll方法は良い仕事をしていませんが、述語で指定された条件に一致するすべての項目を、削除します。

条件を指定した特定の数のアイテムのみを削除したい場合はどうすればよいですか?これを行う最善の方法は何だと思いますか?

答えて

8

削除する項目数の上限および削除する項目を選択するための条件の両方を指定したい場合は、この方法を使用することができます。

int limit = 30; // Suppose you want to remove 30 items at most 
list.RemoveAll(item => ShouldIRemoveThis(item) && limit-- > 0); 
+0

ラムダ式はとても素晴らしい!です。 – Cheeso

1

"limit"パラメータを指定しない限り、最適なオプションは、一致するアイテムを削除する単純なループで、増分された "マッチカウンター"が制限値に達すると解除されます。

これは、内部機能がどのように機能するのかというと、より最適化された方法です。

1

フレームワーク3.5では、RemoveAllメソッドは、述部をパラメーターとして取ります。したがって、使用することがあります

list.RemoveAll(item => ShouldIRemoveThis(item)); 

ここでは、アイテムをリストから削除する必要があるかどうかを示すブール値を返すメソッドです。

1

LINQを使用できますか?そうであれば、.Take()メソッドを使い、必要なレコードの数を指定することができます(おそらくtotal-Nとして)。

0

ここでは匿名の代理人が役に立ちます。最初のの制限番号の偶数をリストから削除する簡単な例

List<int> myList = new List<int>; 
for (int i = 0; i < 20; i++) myList.add(i); 

int total = 0; 
int limit = 5; 
myList.RemoveAll(delegate(int i) { if (i % 2 == 0 && total < limit) { total++; return true; } return false; }); 

myList.ForEach(i => Console.Write(i + " ")); 

1 3 5 7 9 10 11 12 13 14 15 16 17 18 19がわかりました。ラムダ式としての使用に適した関数で、実際のテストをパラメータとしてラップするのに十分簡単です。代わりに使用することができます

list.RemoveAll(item => ShouldIRemoveThis(item)); 

5

@buyutec

list.RemoveAll(ShouldIRemoveThis); 

ラムダがメソッドと同じシグネチャを持っているので、あなただけ渡すことができるように、彼らは同じですメソッドを直接呼び出します。

関連する問題