Hi Cavin,
The case may caused by two reasons:
1. When invoke ToArray() method of a List<T>, a new T[] will be created and its values are copied from the List<T>, so, even if the List<T> is GCed, the new T[] still alive. Just as Vitaliy said, review your code to find out ToArray operations.
2. If size of the inner T[] is big enough, it will be allocated at the Large Object Heap (LOH). since GC on generation 0 is more frequent than on LOH, the situation (the inner T[] still alive but the List<T> has been GCed) can happen. In this condition, I don't think it is a memory leak, it is just because the size of objects on LOH haven't reach threshold, so the GC on LOH is not triggered.
Thanks,
Eric
Please remember to mark helpful replies as answers and unmark them if they provide no help.