關於序列元素的最佳方法是什麼,請致電Dispose()
?如何處理使用LINQ的IDisposable序列?
假設有這樣的:
IEnumerable<string> locations = ...
var streams = locations.Select (a => new FileStream (a , FileMode.Open));
var notEmptyStreams = streams.Where (a => a.Length > 0);
//from this point on only `notEmptyStreams` will be used/visible
var firstBytes = notEmptyStreams.Select (a => a.ReadByte());
var average = firstBytes.Average();
你如何(只要他們不再需要)處置FileStream
情況下,同時保持簡潔代碼?
澄清:這不是一個實際的代碼段,這些行是在一組的類的方法,和FileStream
類型也只是一個例子。
是做線沿線的東西:
public static IEnumerable<TSource> Where<TSource> (
this IEnumerable<TSource> source ,
Func<TSource , bool> predicate
)
where TSource : IDisposable {
foreach (var item in source) {
if (predicate (item)) {
yield return item;
}
else {
item.Dispose();
}
}
}
可能是一個好主意嗎?
另外:你總是解決關於IEnumerable<IDisposable>
一個非常特殊的情況,但不嘗試概括?這是因爲這是一種非典型的情況嗎?你是否圍繞第一位設計?如果是這樣,怎麼樣?
我不喜歡這個問題的是,如果沒有你正在努力實現的具體情景,答案中的所有努力可能完全關閉。它引發了一個有趣的討論,但它可能遠不能解決真正的解決方案。 – eglasius 2010-09-12 01:44:39
針對特定場景的專門解決方案很可能是微不足道的,至今爲止的答案都表明。如果有更通用的方法來處理IEnumerable,我很感興趣。我想,在IDisposable周圍創建monad是朝着這個方向邁出的一步。 –
chase
2010-09-12 05:37:25
我不認爲你的方法例子是一個好主意。 LINQ方法不應該對枚舉值產生副作用,而且你的方法非常嚴重。 – zneak 2010-09-12 15:58:32