У меня есть linq с Select
, где создаются IDisposable
объекты.После этого есть фильтр Where
, который приводит к тому, что какой-то объект никогда не будет уничтожен.
Вот ответ:
class Program
{
static void Main(string[] args)
{
var results = "1234567890"
.Select(o => new Test(o))
.Where(o => o.Value > '3' && o.Value < '7')
.ToList();
// do something with results
// ...
// dispose
foreach (var result in results)
result.Dispose();
}
}
class Test : IDisposable
{
public char Value { get; }
public Test(char value)
{
Value = value;
Console.WriteLine($"{Value}");
}
public void Dispose() => Console.WriteLine($"{Value} disposed");
}
Вывод:
1
2
3
4
5
6
7
8
9
0
4 disposed
5 disposed
6 disposed
Проблема:
Как видите, есть 1
, 2
, 3
, 7
, 8
, 9
, 0
, которые созданы иникогда не выбрасывайте.
Мое решение:
Я могу переместить Where
условие внутрь Select
, но тогда мне нужно применить уродливый "return null
+ Where
не null
"Обходной путь:
var results = "1234567890".Select(o =>
{
if (o > '3' && o < '7')
return new Test(o);
return null;
}).Where(o => o != null).ToList();
Вывод:
4
5
6
4 disposed
5 disposed
6 disposed
Есть ли лучше (более элегантный) способ?
Мой обходной путь, кроме уродливости, имеет проблему, если Select
находится внутри какого-либо библиотечного метода, возвращающего IEnumerable<T>
, который я не могу изменить.Как наносить Where
без протечек?