Debug.GC() freeze/reboot

I meant that you chain blocks, not the items within the blocks.

You missed my point, I was not trying to tell you anything about using Capacity, I was explaining the 700KB allocation limit and used Capacity as an example.

Mike suggestion to chain blocks is a good suggestion as it will avoid the single allocation size limit. Each block might be an ArrayList of items.

I’ll try different approches and post the results.

@ Reinhard Ostermeier - Here is a quick example

This runs on the G400

[ol]I have pushed this to 20000 instances created on each load and it worked
The complete ICollection, IList & IEnumerable implementation for LargeArrayList is left as an exercise for the reader.[/ol]

using System;
using Microsoft.SPOT;
using System.Collections;

namespace MFConsoleApplication1
    public class Program
        public static void Main()
            uint waterMark = Debug.GC(true);
            Debug.Print("Memory:" + waterMark);

            var loader1 = new Loader();

            var loader2 = new Loader();

            Debug.Print("Memory Used:" + (waterMark - Debug.GC(true)));

    public class Loader
        public void CreateSome()
            for (int n = 0; n < 400; ++n)
                _data.Add(new KmaParam() { TelegramNo = n });

        LargeArrayList _data = new LargeArrayList();

    internal class KmaParam
       public int TelegramNo;

    public class LargeArrayList
        private const int ItemsPerBlock = 256;

        private ArrayList _items = new ArrayList();
        private ArrayList _currentBlock;
        private int _count;

        public void Add(object item)
            if (_currentBlock == null || _currentBlock.Count == ItemsPerBlock)
                _currentBlock = new ArrayList();

        public object this[int index]
                if (index < 0 || index >= _count) throw new ArgumentOutOfRangeException("index");
                int block = index / ItemsPerBlock;
                int blockIndex = index % ItemsPerBlock;
                return ((ArrayList)_items[block])[blockIndex];

@ taylorza - Thanks a lot, I’ll give it a try. If it works for me I complete it and pot on codeshare.

@ Reinhard Ostermeier - It is a pleasure, I hope it gets you in a position to ship your product! And credit to @ Mike, I believe this is actually what he was explaining or at least something similar.

@ taylorza - I have posted my implementation here:
It’s tested by sample code and my project.
I have chosen to not implement IList because of Insert and Remove methods.
So it ‘only’ supports ICollection++.

@ Reinhard Ostermeier -

Since you found out solution, so we will keep it as lower priority.

I am glad that help!

If you kept it as ArrayList of ArrayLists you would find that Insert and Remove are actually quite easy to implement.

It’s not that I fear the implementation, but imagine inserting a new item at the beginning of a 5000 item list. Even when using a ArrayList of ArrayLists you Need to move one item over all lists to keep the block size constant.
Thats’s not very performant.
I wanted to create the optimal solution for a straight forward list. Write once read often.