Sortedlist And Linkedlist In C# Complete Guide

 Last Update:2025-06-23T00:00:00     .NET School AI Teacher - SELECT ANY TEXT TO EXPLANATION.    6 mins read      Difficulty-Level: beginner

Understanding the Core Concepts of SortedList and LinkedList in C#

SortedList and LinkedList in C#: A Comprehensive Guide

1. SortedList

Overview:

  • Data Structure: SortedList is a dynamic array that stores a collection of key-value pairs in a sorted order based on the keys.
  • Namespace: Defined within System.Collections namespace for non-generic collection, and System.Collections.Generic for generic collection (SortedList<TKey, TValue>).

Key Features:

  • Sorted: Elements are always ordered by keys, providing easy access and retrieval.
  • Dictionary-like: Supports fast key-based lookup, insertion, and deletion. However, it is typically slower than Dictionary<TKey, TValue> for these operations due to the need to maintain order.
  • Index-based Access: Supports both key-based and index-based access to elements.

Performance Characteristics:

  • Insertion: Average and worst-case performance for insertion is O(n) because elements might need to be shifted to maintain sorted order.
  • Deletion: Deletion is also O(n) due to potential shifting of elements.
  • Lookup: Fast lookup with average and worst-case performance of O(log n), owing to the binary search used for finding keys.

Use Cases:

  • Ideal when you need to frequently access elements by their sorted order.
  • Suitable for scenarios where maintaining a sorted collection of items is crucial for business logic.
  • Not ideal for high-frequency insertions and deletions due to their linear time complexity.

Important Members:

  • Add(TKey key, TValue value): Adds a key-value pair to the SortedList.
  • Remove(TKey key): Removes the element with the specified key.
  • ContainsKey(TKey key): Checks if the SortedList contains a specific key.
  • Clear(): Removes all elements from the SortedList.

Examples:

Non-Generic SortedList:

using System;
using System.Collections;

class Program
{
    static void Main()
    {
        SortedList mySortedList = new SortedList();
        mySortedList.Add(2, "Two");
        mySortedList.Add(1, "One");
        mySortedList.Add(3, "Three");

        // Output: [1, One] [2, Two] [3, Three]
        foreach (DictionaryEntry entry in mySortedList)
        {
            Console.Write($"[{entry.Key}, {entry.Value}] ");
        }
    }
}

Generic SortedList:

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        SortedList<int, string> mySortedList = new SortedList<int, string>();
        mySortedList.Add(2, "Two");
        mySortedList.Add(1, "One");
        mySortedList.Add(3, "Three");

        // Output: [1, One] [2, Two] [3, Three]
        foreach (var entry in mySortedList)
        {
            Console.Write($"[{entry.Key}, {entry.Value}] ");
        }
    }
}

2. LinkedList

Overview:

  • Data Structure: LinkedList is a doubly-linked list that stores elements sequentially. Each node in the list contains a reference to both the next and the previous node, facilitating efficient insertion and deletion from any position.
  • Namespace: Found in System.Collections.Generic namespace as LinkedList<T>.

Key Features:

  • Doubly-Linked: Enables traversal in both forward and reverse directions.
  • Dynamic Length: No need to define an initial size; it grows and shrinks dynamically.
  • No Indexing: Unlike ArrayList and List<T>, LinkedList does not support random access to elements based on their index.

Performance Characteristics:

  • Insertion/Deletion: Average and worst-case performance are O(1) if you already have a reference to the node to be inserted or deleted. Otherwise, you must traverse the list in O(n) to find the node.
  • Traversal: Efficient for forward and backward traversal with each step costing O(1).
  • Lookup: Accessing elements by index is not supported; lookup based on index is O(n).

Use Cases:

  • Ideal for situations where frequent insertions and deletions from any position are required.
  • Suitable for creating queues or stacks where elements need to be added or removed from the beginning or end of the collection.
  • Use in scenarios where the data needs to be maintained in a certain sequence without the overhead of maintaining a sorted order.

Important Members:

  • AddFirst(T value) and AddLast(T value): Adds elements to the beginning or end of the list.
  • RemoveFirst() and RemoveLast(): Removes elements from the beginning or end of the list.
  • Find(T value): Finds the node that contains the specified value.
  • Clear(): Removes all elements from the LinkedList.

Examples:

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        LinkedList<string> myLinkedList = new LinkedList<string>();
        myLinkedList.AddFirst("B");
        myLinkedList.AddFirst("A");
        myLinkedList.AddLast("C");

        // Output: A B C
        foreach (string item in myLinkedList)
        {
            Console.Write($"{item} ");
        }

        LinkedListNode<string> node = myLinkedList.Find("B");
        if (node != null)
        {
            myLinkedList.AddAfter(node, "AB");
        }

        // Output: A B AB C
        foreach (string item in myLinkedList)
        {
            Console.Write($"{item} ");
        }
    }
}

Key Differences Between SortedList and LinkedList

| Feature | SortedList | LinkedList | |-------------------------|-------------------------------------------------|---------------------------------------------------| | Data Structure Type | Dynamic Array | Doubly-Linked List | | Sorting | Always sorted by keys | Not sorted | | Index-based Access | Supported | Not supported | | Insertion | O(n) | O(1) if node reference is known, otherwise O(n) | | Deletion | O(n) | O(1) if node reference is known, otherwise O(n) | | Traversal | Less efficient due to lack of direct indexing | Efficient in both forward and backward directions | | Lookup | Fast (O(log n)) | Slow (O(n)) | | Use Case | When maintaining a sorted order is critical | When frequent insertions and deletions occur |

Conclusion

Both SortedList and LinkedList are valuable tools in the C# developer's toolkit, each offering unique advantages suited to specific requirements. SortedList is advantageous when sorted data access is crucial and the cost of frequent insertions and deletions is manageable. Conversely, LinkedList excels in scenarios that demand efficient insertions and deletions from arbitrary positions, making it a preferred choice for implementing queues and stacks. Choosing between them depends on the specific characteristics and performance considerations of your application's data management needs.

Online Code run

🔔 Note: Select your programming language to check or run code at

💻 Run Code Compiler

Step-by-Step Guide: How to Implement SortedList and LinkedList in C#

SortedList Example:

SortedList is a collection that stores key-value pairs and maintains them in sorted order based on the keys.

Example: Creating and Using a SortedList in C#

using System;
using System.Collections;

class SortedListExample
{
    public static void Main()
    {
        // Step 1: Create a new SortedList instance
        SortedList<int, string> sortedList = new SortedList<int, string>();

        // Step 2: Adding key-value pairs to the SortedList
        sortedList.Add(3, "Three");
        sortedList.Add(1, "One");
        sortedList.Add(4, "Four");
        sortedList.Add(2, "Two");

        // Step 3: Displaying the contents of the SortedList
        Console.WriteLine("SortedList contents:");
        foreach (DictionaryEntry entry in sortedList)
        {
            Console.WriteLine($"Key: {entry.Key}, Value: {entry.Value}");
        }

        // Step 4: Searching for a specific key
        int keyToFind = 3;
        if (sortedList.ContainsKey(keyToFind))
        {
            Console.WriteLine($"Found key {keyToFind} with value {sortedList[keyToFind]}");
        }
        else
        {
            Console.WriteLine($"Key {keyToFind} not found.");
        }

        // Step 5: Removing an item from the SortedList
        int keyToRemove = 2;
        if (sortedList.ContainsKey(keyToRemove))
        {
            sortedList.Remove(keyToRemove);
            Console.WriteLine($"Removed key {keyToRemove}");
        }
        else
        {
            Console.WriteLine($"Key {keyToRemove} not found for removal.");
        }

        // Step 6: Displaying the contents of the SortedList after removal
        Console.WriteLine("\nSortedList contents after removal:");
        foreach (DictionaryEntry entry in sortedList)
        {
            Console.WriteLine($"Key: {entry.Key}, Value: {entry.Value}");
        }
    }
}

Explanation:

  1. Creating a SortedList: We create an instance of SortedList<int, string> which stores integers as keys and strings as values.
  2. Adding Elements: We use the Add method to add elements to the SortedList. The keys are automatically sorted.
  3. Displaying Elements: We use a foreach loop to iterate through the elements and print each key-value pair.
  4. Searching: We use ContainsKey to check if a specific key exists and then access its value.
  5. Removing Elements: We use the Remove method to delete a key-value pair.
  6. Re-displaying Elements: We print the SortedList again to see the effect of removing an element.

LinkedList Example:

LinkedList is a doubly linked list which means each node has a pointer to both the next and the previous node. This allows efficient insertion and removal of elements without reordering other elements.

Example: Creating and Using a LinkedList in C#

Top 10 Interview Questions & Answers on SortedList and LinkedList in C#

1. What is a SortedList in C#?

Answer:
A SortedList in C# is a collection that stores key-value pairs and maintains them in sorted order based on the keys. Internally, it uses both an array of keys and an array of values. As you add new elements, it automatically sorts the collection using the provided key comparer. It is part of the System.Collections namespace.

2. How is a SortedList implemented in C#?

Answer:
Under the hood, a SortedList is implemented using two arrays: one for keys and another for values. The keys are stored in a sorted manner, which allows for efficient binary search operations, providing logarithmic time complexity (O(log n)) for adding, removing, and accessing elements by key. Retrieving or traversing values by index can be done in constant time (O(1)).

3. What are the key differences between a SortedList and a List in C#?

Answer:
Key differences include:

  • Sorted vs Unsorted: A SortedList keeps the elements sorted by key, while a List<T> does not maintain any sort order.
  • Data Structure: A SortedList uses two separate arrays for keys and values, whereas a List<T> is essentially an array of objects (or a dynamic array).
  • Performance: Inserting into a SortedList has a higher cost than inserting into a List<T> due to the need to keep it sorted, typically O(n). A List<T> can perform inserts in constant time if the underlying capacity has room after resizing (O(n) when resizing).
  • Memory Usage: Due to two separate arrays, a SortedList uses more memory compared to a List<T>, which only requires one array.

4. Can you explain how a LinkedList in C# works?

Answer:
A LinkedList<T> in C# stores a sequence of objects where every element (node) is linked to the next node via a reference pointer. Unlike arrays, linked lists do not require contiguous memory allocation. They allow for fast insertions and deletions (O(1)) anywhere in the list once a node is found, but finding nodes takes linear time (O(n)). This makes LinkedList<T> ideal for scenarios with frequent insertions or deletions and less need for indexed access.

5. What are the main differences between SortedList and LinkedList?

Answer:

  • Sorting: SortedList is always sorted by keys, while LinkedList<T> is unordered unless managed manually.
  • Node Representation: SortedList represents elements as key-value pairs within two arrays, whereas LinkedList<T> represents elements as individual nodes linked together.
  • Access Time: For keyed data, accessing elements in a SortedList can be faster due to its sorted nature (O(log n) search) compared to LinkedList<T> (O(n)).
  • Modification Cost: Modifications like insertions and deletions in LinkedList<T> are faster (O(1)) if the position is known compared to SortedList (O(n)).

6. Why should I use a SortedList over a Dictionary?

Answer:

  • Order Maintenance: If you need the collection to store elements in a sorted order by keys, SortedList is preferable over Dictionary, since the latter does not guarantee any specific order.
  • Duplicates Handling: Unlike SortedList, a Dictionary<T,K> cannot store duplicate keys. However, SortedList can if you specify a custom comparison that allows for duplicates.
  • Performance: In terms of performance, SortedList can be slower for unsorted insertions due to its maintaining a sorted order. Dictionary provides faster lookups and insertion (O(1) average) but doesn't impose any sorting constraints.

7. When is it appropriate to use a LinkedList?

Answer:

  • Frequent Modifications: A LinkedList<T> is ideal when you have a lot of insertions and deletions at arbitrary positions.
  • Sequential Access: It’s great for iterating through elements sequentially.
  • Memory Optimization: Useful when you don’t know the number of items in advance and wish to avoid frequent resizing of arrays as seen in List<T>.

8. How do you perform a binary search on a SortedList?

Answer:
You can perform binary search on a SortedList because it is inherently sorted. You can use the built-in method IndexOfKey to find the index of a key efficiently. If the key exists, it returns the index; otherwise, it returns a negative number indicating the bitwise complement of the index where the key would be inserted to maintain order.

9. What is the difference between AddBefore and AddFirst methods in LinkedList?

Answer:

  • AddFirst Method: Adds a new node containing the specified value to the beginning of the LinkedList<T>.
  • AddBefore Method: Inserts a new node containing the specified value before a given existing node in the list. This method needs a reference to the node before which the new node should be added.

10. How should you choose between SortedList and LinkedList?

Answer:
Choosing between SortedList and LinkedList depends on your application's requirements:

  • Use SortedList when:
    • You need elements to be sorted and can accept the overhead of maintaining order.
    • You primarily do lookups by keys rather than by index.
  • Use LinkedList when:
    • Frequent insertions/deletions are required at arbitrary positions.
    • Memory usage is a concern as linked lists do not require block allocations for resizing.
    • You prefer sequential access over indexed access.

You May Like This Related .NET Topic

Login to post a comment.