Simple, Quality, Awesome Software

Building Your Own Generic List Class

Below is the complete code for the Building Your Own Generic List Class Try It Out! problem.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Generics
{
    /// <summary>
    /// Defines a generic list, which is growable. New items can be
    /// added to it without concern for resizing the list, as that
    /// is managed for us.
    ///
    /// This is a generic list, so it can be used with any specific type.
    /// </summary>
    public class PracticeList<T>
    {
        /// <summary>
        /// Stores the actual items as an array.
        /// </summary>
        private T[] items;

        /// <summary>
        /// Creates a new list. This list contains no values initially.
        /// </summary>
        public PracticeList()
        {
            items = new T[0];
        }

        /// <summary>
        /// Returns a specific item in the array. This would ideally be done
        /// with an indexer, which we talk about later on.
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>
        public T GetItem(int index)
        {
            return items[index];
        }

        /// <summary>
        /// Adds an item to the end of the list.
        /// </summary>
        /// <param name="newItem"></param>
        public void Add(T newItem)
        {
            // Create a new array that is one item bigger than before.
            T[] newItems = new T[items.Length + 1];

            // Copy all of the items from one array to another.
            for (int index = 0; index < items.Length; index++)
            {
                newItems[index] = items[index];
            }

            // In the last spot, place the new item.
            newItems[newItems.Length - 1] = newItem;

            // Reassign our backing array to the newly constructed,
            // and slightly larger array.
            items = newItems;
        }

        /// <summary>
        /// Returns the size of the list.
        ///
        /// This makes it much easier to loop over.
        /// </summary>
        public int Size
        {
            get
            {
                return items.Length;
            }
        }
    }
}