Understanding Collections and Collections Interfaces

Understanding Collections and Collections Interfaces

15 Oct 2024
Advanced
129K Views
25 min read
Learn with an interactive course and practical hands-on labs

Free C# Foundation Course: Learn C# In 21 Days

Collections in C#

C# Collections are important for developers seeking to manage groups of related objects efficiently. Imagine having the capability to store, retrieve, and manipulate data in various formats, such as lists, dictionaries, or queues, allowing for more organized and flexible code. Collections provide a powerful way to work with groups of objects, offering built-in methods for searching, sorting, and modifying data without the need for additional structures.

In this C# tutorial, I’ll explain the different types of Collections and Collection Interfaces in C#, how they streamline data management by providing versatile data structures, and why mastering them is crucial for writing effective, scalable C# applications.

What is Collections?

  • Collections in C# are unique containers that allow you to store and manage groups of linked items.
  • Collections, unlike arrays, are flexible, allowing you to simply add or remove items without regard for a fixed size.
  • Collections can be used with any type of data, including numbers, texts, and complex objects.
  • C# has several forms of collections, including lists, dictionaries, and queues, each with a distinct function.

For example, a list is ideal for storing items in order, whereas a dictionary allows you to seek up objects using keys. Collections make it easier to manage large amounts of data, allowing you to write cleaner and more efficient code.

Types of Collections

.NET supports two main types of collections: generic and non-generic. Before .NET 2.0, only non-generic collections were available. With the introduction of generics, you now have more options to choose from.

Here’s a quick comparison of some common non-generic and generic collections:

Non-genericGeneric
ArrayListList
HashTableDictionary
SortedListSortedList
StackStack
QueueQueue

Read More - C Sharp Interview Questions

Collections in C#:

Example of Collections:

Let's elaborate collections in C# Compiler with its example
 using System; 
using System.Collections; 

class Scholarhat { 
	
	public static void Main() 
	{ 
		
		Queue CourseQueue = new  Queue(); 

		CourseQueue.Enqueue("C#"); 
		CourseQueue.Enqueue("Java"); 
		CourseQueue.Enqueue("SQL"); 
		CourseQueue.Enqueue("Python"); 
		CourseQueue.Enqueue("C"); 

		Console.Write("Total number of courses present in the Queue are: "); 

		Console.WriteLine(CourseQueue.Count); 

		// Displaying the beginning element of Queue 
		Console.WriteLine("Course: " + CourseQueue.Peek()); 
	} 
}     

Output

Total number of courses present in the Queue are: 5
Course: C#

Explanation

In the above program, we illustrate nongeneric collections using a queue. First, we created a queue named "CourseQueue".Then We Inserted the elements into the Queue. Then, we tried to display the count of elements along with the starting course.

1. Non-Generic Collections

In non-generic collections, you can store items of different types. These collections are flexible, allowing you to add or remove items at runtime. Here are some commonly used non-generic collections:

1. C# ArrayList

The ArrayList class is a collection that can hold any type of object. It behaves like an array but doesn't have a fixed size. You can add as many items as you need.

Example

using System;
using System.Collections;

public class Program
{
    public static void Main()
    {
        ArrayList al = new ArrayList();
        al.Add("Kiran Teja Jallepalli");
        al.Add(7);
        al.Add(DateTime.Parse("8-Oct-1985"));

        foreach (object o in al)
        {
            Console.WriteLine(o);
        }
    }
}

Output

Kiran Teja Jallepalli
7
10/8/1985 12:00:00 AM

Explanation

  • In this code, an ArrayList is formed to contain items of various types (strings, integers, and DateTime values).
  • The Add function is used to add these values to the ArrayList.
  • The foreach loop iterates through the collection and prints each element to the terminal.
  • This demonstrates how ArrayList can handle heterogeneous data.

2. C# HashTable

The HashTable class stores items in key-value pairs, making it easy to retrieve values using their corresponding keys.

Example

using System;
using System.Collections;

public class Program
{
    public static void Main()
    {
        Hashtable ht = new Hashtable();
        ht.Add("ora", "oracle");
        ht.Add("vb", "vb.net");
        ht.Add("cs", "cs.net");
        ht.Add("asp", "asp.net");

        foreach (DictionaryEntry d in ht)
        {
            Console.WriteLine(d.Key + " " + d.Value);
        }
    }
}

Output

vb vb.net
asp asp.net
cs cs.net
ora oracle

Explanation

  • In this code, a Hashtable is used to hold key-value pairs, with each key mapping to a corresponding value (for example, "ora" to "oracle").
  • The Add method adds key-value pairs to the Hashtable.
  • A foreach loop iterates across the Hashtable, printing both the keys and their associated values to the terminal.
  • This example shows how to utilize a Hashtable to manage key-value data efficiently.

3. C# SortedList

The SortedList class combines features of both ArrayList and HashTable, storing items as key-value pairs in a sorted order.

Example

using System;
using System.Collections;

public class Program
{
    public static void Main()
    {
        SortedList sl = new SortedList();
        sl.Add("ora", "oracle");
        sl.Add("vb", "vb.net");
        sl.Add("cs", "cs.net");
        sl.Add("asp", "asp.net");

        foreach (DictionaryEntry d in sl)
        {
            Console.WriteLine(d.Key + " " + d.Value);
        }
    }
}

Output

asp asp.net
cs cs.net
ora oracle
vb vb.net

Explanation

  • In this code, a SortedList is used to store key-value pairs, with the keys automatically sorted ascending.
  • The Add method adds key-value pairs to the SortedList.
  • A foreach loop iterates through the sorted key-value pairs, printing each key and its corresponding value to the console.
  • This example shows how a SortedList keeps a sorted collection of key-value pairs for effective data management.

4. C# Stack

A Stack follows the Last In, First Out (LIFO) principle, where the last item added is the first one to be removed.

Example

using System;
using System.Collections;

public class Program
{
    public static void Main()
    {
        Stack stk = new Stack();
        stk.Push("cs.net");
        stk.Push("vb.net");
        stk.Push("asp.net");
        stk.Push("sqlserver");

        foreach (object o in stk)
        {
            Console.WriteLine(o);
        }
    }
}

Output

sqlserver
asp.net
vb.net
cs.net

Explanation

  • In this code, a stack collection is used to store elements in Last-In-First-Out (LIFO) order.
  • The Push method places things at the top of the stack.
  • Using a foreach loop, the stack's elements are iterated and written to the console.
  • The stack stores and displays the items in the reverse order that they were added, exhibiting the Stack collection's LIFO behavior.

5. C# Queue

A Queue works on the First In, First Out (FIFO) principle, meaning the first item added is the first one to be removed.

Example

using System;
using System.Collections;

public class Program
{
    public static void Main()
    {
        Queue q = new Queue();
        q.Enqueue("cs.net");
        q.Enqueue("vb.net");
        q.Enqueue("asp.net");
        q.Enqueue("sqlserver");

        foreach (object o in q)
        {
            Console.WriteLine(o);
        }
    }
}

Output

cs.net
vb.net
asp.net
sqlserver

Explanation

  • In this code, entries are stored in a Queue collection in First-In-First-Out (FIFO) order.
  • The Enqueue method moves elements to the end of the queue.
  • Using a foreach loop, the queue's elements are iterated and reported to the console.
  • The queue shows the items in the same order they were added, demonstrating the FIFO characteristic of the Queue collection.

2. Generic Collections

Generic collections are more type-safe than non-generic collections. You specify the type of items you want to store, which helps prevent runtime errors. Here are some commonly used generic collections:

1. C# List

The List class is a flexible array that can store a specific type of item.

Example

using System;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        List lst = new List();
        lst.Add(100);
        lst.Add(200);
        lst.Add(300);
        lst.Add(400);

        foreach (int i in lst)
        {
            Console.WriteLine(i);
        }
    }
}

Explanation

  • This code creates a list to store integers.
  • The Add method adds four integer numbers to the list (100, 200, 300, and 400).
  • The foreach loop iterates through the list and prints each value to the console.
  • This shows how a generic List<int> is used in C# to store and access integers.

2. C# Dictionary

The Dictionary class is a collection of key-value pairs where both the key and the value are strongly typed.

Example

using System;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        Dictionary dct = new Dictionary();
        dct.Add(1, "cs.net");
        dct.Add(2, "vb.net");
        dct.Add(3, "asp.net");
        dct.Add(4, "sqlserver");

        foreach (KeyValuePair kvp in dct)
        {
            Console.WriteLine(kvp.Key + " " + kvp.Value);
        }
    }
}

Output

1 cs.net
2 vb.net
3 asp.net
4 sqlserver

Explanation

  • In this code, key-value pairs are stored in a dictionary.
  • The Add method adds entries using integer keys and string values.
  • The foreach loop traverses the dictionary using KeyValuePair to retrieve both keys and values.
  • Each key-value pair is written to the console, demonstrating how dictionaries assign keys to associated values.

3. C# SortedList

You can also use a generic SortedList, which stores items in sorted order as key-value pairs.

Example

using System;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        SortedList sl = new SortedList();
        sl.Add("ora", "oracle");
        sl.Add("vb", "vb.net");
        sl.Add("cs", "cs.net");
        sl.Add("asp", "asp.net");

        foreach (KeyValuePair kvp in sl)
        {
            Console.WriteLine(kvp.Key + " " + kvp.Value);
        }
    }
}

Output

asp asp.net
cs cs.net
ora oracle
vb vb.net

Explanation

  • This code creates a SortedList to store key-value pairs in which both the keys and values are strings.
  • The Add method is used to create entries, and the keys are sorted automatically.
  • The foreach loop iterates across the list, accessing and printing each key-value pair using KeyValuePair.
  • This demonstrates how a SortedList sorts entries based on their keys.

4. C# Stack

You can also use a generic Stack, which is type-safe.

Example

using System;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        Stack stk = new Stack();
        stk.Push("cs.net");
        stk.Push("vb.net");
        stk.Push("asp.net");
        stk.Push("sqlserver");

        foreach (string s in stk)
        {
            Console.WriteLine(s);
        }
    }
}

Output

sqlserver
asp.net
vb.net
cs.net

Explanation

  • In this code, string elements are stored in a Stack collection using the Push method, which moves elements to the top of the stack.
  • The foreach loop cycles around the stack, obtaining and printing each element in the last-in, first-out (LIFO) order.
  • This example shows basic stack operations and iteration in C#.

5. C# Queue

Similarly, you can use a generic Queue.

Example

using System;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        Queue q = new Queue();

        q.Enqueue("cs.net");
        q.Enqueue("vb.net");
        q.Enqueue("asp.net");
        q.Enqueue("sqlserver");

        foreach (string s in q)
        {
            Console.WriteLine(s);
        }
    }
}

Output

cs.net
vb.net
asp.net
sqlserver

Explanation

  • In this code, a Queue collection is used to store string elements, with the Enqueue method adding elements to the end of the queue.
  • The foreach loop cycles through the queue, obtaining and printing each element in the first-in, first-out (FIFO) manner.
  • This example shows fundamental queue operations, including iteration in C#.

What are Collection Interfaces?

All of the collection types use some common interfaces. These common interfaces define the basic functionality for each collection class. The key collections interfaces are : IEnumerable, ICollection, IDictionary, and IList.

Collection Interfaces

IEnumerable acts as a base interface for all the collection types that is extended by ICollection. ICollection is further extended by IDictionary and IList.

Interface
Description
IEnumerable
Provides an enumerator that supports a simple iteration over a non-generic collection.
ICollection
Defines size, enumerators, and synchronization methods for all nongeneric collections.
IDictionary
Represents a nongeneric collection of key/value pairs.
IList
Represents a non-generic collection of objects that can be individually accessed by index.

All collections interfaces are not implemented by all the collections. It depends on the collection's nature.

The IEnumerable Interface: Syntax

 public IEnumerator GetEnumerator(  )
{
    return (IEnumerator) new ListBoxEnumerator(this);
}   
  • Here, The Enumerator must implement the IEnumerator methods and properties.
  • These can be implemented either directly by the container class or by a separate class.
  • The latter approach is preferred because it encapsulates this responsibility in the Enumerator class.

The ICollectionInterface: Syntax

ICollection names = new List();
names.Add("Pragati");
names.Remove("surbhi");
Console.WriteLine(names.Count); // Outputs the count of items

The IDictionary: Syntax

IDictionary ages = new();
ages["Pragati"] = 18;
ages.Add("surbhi", 17);
Console.WriteLine(ages["Pragati"]); // Access value by key

The IList: Syntax

IList numbers = new List { 1, 2, 3,4,5 };
numbers[0] = 10; // Access and modify elements by index
Console.WriteLine(numbers.IndexOf(3)); // Outputs the index of '5'
Summary
C# Collections are flexible data structures that enable the effective management of groups of objects by providing built-in methods for finding, sorting, and changing data. They are classified as non-generic (flexible but less type-safe) and generic collections (type-safe and optimized). Mastering collections like lists, dictionaries, stacks, and queues is critical for creating scalable and organized C# applications. To master more C# concepts, enroll in Scholarhat's C# Programming Course.

FAQs

A Collection represents a group of objects known as its elements. The Collection interface is used to pass around collections of objects where maximum generality is desired.

It is used to pass around collections of objects where maximum generality is desired.

It made to more effectively organize, store, and modify comparable data. 

Take our Csharp skill challenge to evaluate yourself!

In less than 5 minutes, with our skill challenge, you can identify your knowledge gaps and strengths in a given skill.

GET FREE CHALLENGE

Share Article
About Author
Shailendra Chauhan (Microsoft MVP, Founder & CEO at Scholarhat by DotNetTricks)

Shailendra Chauhan is the Founder and CEO at ScholarHat by DotNetTricks which is a brand when it comes to e-Learning. He provides training and consultation over an array of technologies like Cloud, .NET, Angular, React, Node, Microservices, Containers and Mobile Apps development. He has been awarded Microsoft MVP 9th time in a row (2016-2024). He has changed many lives with his writings and unique training programs. He has a number of most sought-after books to his name which has helped job aspirants in cracking tough interviews with ease.
Accept cookies & close this