Skip to content

Collections and Generics#

All collections are in the namespace System.Collections and are structered like the following csharpCollections

Arrays#

Whether an array element type is a value type or a reference type has important performance implications. Value type they all get given the default value, where as reference they all have null references.

char[] vowels = new char[5]; // Declare an array of 5 characters
char[] vowels = new char[] {'a','e','i','o','u'};

Rectangular arrays#

int[,] a = new int[4,6];
int[,] b = new int[,]
{
    {0,1,2},
    {3,4,5},
    {6,7,8}
};
int[, ,] c = new int[2, 4, 2];

Jagged arrays#

Jagged arrays are declared using successive square brackets to represent each dimension. Each inner array is implicitly initialized to null. You must manually create each inner array.

int[][] a = new int[2][];
a[0] = new int []{ 1, 2, 3, 4}
a[1] = new int []{ 4, 5, 6};

Simplified Array Initialization#

Can be done even simpler with var, but has shit readability IMO.

char[] vowels = {'a','e','i','o','u'};
int[,] rectangularMatrix =
{
    {0,1,2},
    {3,4,5},
    {6,7,8}
};
int[][] jaggedMatrix =
{
    new int[] {0,1,2},
    new int[] {3,4,5},
    new int[] {6,7,8,9}
};

Indices#

Indices let you refer to elements relative to the end of an array, with the ^ operator.

char[] vowels = new char[] {'a','e','i','o','u'};
char lastElement = vowels [^1]; // 'u'
char secondToLast = vowels [^2]; // 'o'
Index first = 0;
Index last = ^1;
char firstElement = vowels[first]; // 'a'
char lastElement = vowels[last]; // 'u'

Ranges#

Ranges let you “slice” an array by using the .. operator. The second number in the range is exclusive.

char[] vowels = new char[] {'a','e','i','o','u'};
char[] firstTwo = vowels [..2]; // 'a', 'e'
char[] lastThree = vowels [2..]; // 'i', 'o', 'u'
char[] middleOne = vowels [2..3]; // 'i'
char[] lastTwo = vowels [^2..]; // 'o', 'u' can also be combined with indices

Range firstTwoRange = 0..2;
char[] firstTwo = vowels [firstTwoRange]; // 'a', 'e'

Indexers#

class Sentence
{
    string[] words = "The quick brown fox".Split();
    public string this [int wordNum]
    {
        get { return words [wordNum];}
        set { words [wordNum] = value;}
    }
}


Sentence s = new Sentence();
Console.WriteLine(s[3]); // fox
s[3] = "kangaroo";
Console.WriteLine(s[3]); // kangaroo
Console.WriteLine(s); // The quick brown kangaroo

Using indices and ranges with indexers#

public string this [Index index] => words [index];
public string[] this [Range range] => words [range];

// Enables us to do this
Sentence s = new Sentence();
Console.WriteLine (s [^1]); // fox
string[] firstTwoWords = s [..2]; // (The, quick)

Generics#

Generics express reusability through placeholder types and are similar to generics in java.

class Buffer<TElement, TPriority>
{
    private TElement[] data;
    private TPriority[] prio;
    public void Put(TElementx, TPriorityprio) {...}
    public void Get(out TElementx, out TPriorityprio) {...}
}

var a = new Buffer<int,int>();
a.Put(100, 0);
int elem, prio;
a.Get(out elem, out prio);

Bounding#

This method sorts any array , as long as the element T implements IComparable

static void Sort<T>(T[] a) where T : IComparable
{
    for(int i = 0; i < a.Length 1; i++)
        for(int j = i + 1; j < a.Length ; j++)
            if (a[j].CompareTo(a[i]) < 0)
            {
                T x = a[i];
                a[i] = a[j];
                a[j] = x;
            }
        }
    }
}

int[] a = {3, 7, 2, 5};
Sort<int>(a);

Back to top