スレッドセーフな方法でコレクションを反復処理したいと思っています。私は一つの方法を持っているconvieniantです見つけるもっと使いやすい方法デリゲートをデリゲートするデリゲート
/// <summary>
/// Saves each item in the list to the database
/// </summary>
protected static void SaveListToDatabase() {
this.VisitAllItems(item => {
bool itemSavedSuccessfully = item.SaveToDB();
if(!itemSavedSuccessfully) {
//log error message
}
});
}
それの使用の別の例は、
/// <summary>
/// Get the number of special items in the list.
/// </summary>
protected int GetNumberOfUnsynchronisedItems() {
int numberOfSpecialItems = 0;
this.VisitAllItems((item) => {
numberOfSpecialItems += item.IsItemSpecial() ? 1 : 0;
});
return numberOfSpecialItems;
}
だろう、それの例が使用だ
/// <summary>
/// This visits all items and performs an action on them in a thread manner
/// </summary>
/// <param name="visitAction">The action to perform on the item</param>
public void VisitAllItems(Action<Item> visitAction) {
lock (listLock) {
foreach (Item item in this.ItemList) {
visitAction.Invoke(item);
}
}
}
と呼ばれるのかもしれない。しかし、私はそこに確信していますAction<>
デリゲートではなくFunc<>
を使用してこの値を返すように、VisitAllItems
メソッドを書き込む方がよい方法です。私はいくつかのことを試しましたが、コンパイルエラーで終わります。
誰もこの方法を実装するためのより良い方法はありますか?
おかげで、 Alasdair
感謝。私はあなたの説明と両方の両方が私の状況を考慮して同等に適していると理解しています。私がそうでないと確信できない限り、私は誰かがジョンに挑戦するよりも良い理由であなたにポイントを与えました。歓声 – ajmccall
評判スコアに基づいて決めるのではなく、回答自体に基づいて決定するべきです。また、複数の回答をアップウィートすることで、 "ポイントを与える"ことができます。そしてあなたは、あなたが善良で有用なすべての答えをupvoteする必要があります。 – svick
公正なポイント(http://blog.stackoverflow.com/2010/01/stack-overflow-where-we-hate-fun/)。しかし、私の受け入れられた答えはまだ立つ。 @JonSkeetにも+1してください。 – ajmccall