Listing 1: A loosely typed implementation of Accounts

public struct AccountId
    {
        public int m_number;
        public override int GetHashCode()
        {
            return m_number;
        }
    }
    public interface IAccountData
    {
        int Balance { get; set;}
    }

    public struct AccountData : IAccountData
    {
        private int m_balance;
        public int Balance
        {
            get { return m_balance; }
            set { m_balance = value; }
        }
    }

    public class Accounts
    {
        public const int num = 10000;
        IAccountData[] accounts = new IAccountData[num];

        public IAccountData this[Object id]
        {
            get { return accounts[id.GetHashCode()]; }
            set { accounts[id.GetHashCode()] = value; }
        }
    }


Listing 2: A strongly typed implementation of Accounts

    public struct AccountId
    {
        public int m_number;
        public override int GetHashCode()
        {
            return m_number;
        }
    }

    public struct AccountData
    {
        private int m_balance;
        public int Balance
        {
            get { return m_balance; }
            set { m_balance = value; }
        }
    }

    public class Accounts
    {
        public const int num = 10000;
        AccountData[] accounts = new AccountData[num];

        public AccountData this[AccountId id]
        {
            get { return accounts[id.GetHashCode()]; }
            set { accounts[id.GetHashCode()] = value; }
        }
    }


Listing 3: Accessing Account Information

Accounts ac = new Accounts();
int i;

for (i = 0; i < Accounts.num; i++)
{
   AccountData rec = new AccountData();
   rec.Balance = 100;
   AccountId id; id.m_number = i;
   ac[id] = rec;
}

long iterations = 0;
long start = Environment.TickCount;
do
{
   for (i = 0; i < Accounts.num; i++)
   {
      AccountId id;
      id.m_number = i;
      AccountData rec = (AccountData)ac[id];
      rec.Balance -= 10;
      ac[id] = rec;
   }
   iterations += i;
} while (Environment.TickCount - start < 1000);