I wanted to have more precise control over the lifetime of objects I was keeping in a list rather than wait for the GC. I came up with the code below which adds a few extension methods for handling IDisposable objects in a generic list. This was more elegant than adding a helper class.
I only implemented what I needed for the current project but these are very straightforward to do.
Sample code below.
using System;
using System.Collections.Generic;
namespace MyExtensions
{
public static class Extensions
{
/// Remove tail, starting at index.
public static void RemoveTail<T>(this List<T> list, int index)
{
if (index >= list.Count) { return; }
if (typeof(IDisposable).IsAssignableFrom(typeof(T)))
{
List<T> temp = list.GetRange(index, list.Count - index);
ClearAndDispose(temp);
}
list.RemoveRange(index, list.Count - index);
}
public static void ClearAndDispose<T>(this List<T> list)
{
if (typeof(IDisposable).IsAssignableFrom(typeof(T)))
{
foreach (T obj in list)
{
IDisposable iFace = (IDisposable)obj;
iFace.Dispose();
}
}
list.Clear();
}
} //*** Extensions
} //*** namespace
Usage is simple.
using MyExtensions; ... var myList = new List<HugeObject>(); ... myList.RemoveTail(idx); ... myList.ClearAndDispose();