Что лучше всего подходит для вызова Dispose()
на элементах последовательности?Как вы относитесь к последовательностям IDisposable с помощью LINQ?
Предположит, что есть что-то вроде:
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
Специализированное решение для конкретного сценария, скорее всего, было бы тривиальным, как показывают до сих пор ответы. Мне интересно, есть ли более обобщенный подход к передаче IEnumerable. Думаю, создание монады вокруг IDisposable - шаг в этом направлении. –
chase
Я не думаю, что ваш пример метода - хорошая идея. Методы LINQ не должны иметь побочных эффектов для перечисляемых значений, а у вас довольно серьезный. – zneak