C# Tutorial

C# Tutorial C# First Application C# Variables C# Data Types C# Operators C# Keywords

C# Control Statement

C# If Statements C# Switch Statements C# for Loop C# While Loop C# do While loop C# Jump Statements C# Function C# functions with out variable

C# Arrays

C# Arrays

C# Function

C# Function call by value C# Call by reference C# Passing array to function C# Multidimensional Arrays C# Jagged Arrays C# Params C# Array Class C# Command Line Arguments

C# Object Class

C# Object and Classes C# Constructors C# Destructor C# this Keyword C# static field C# static class C# Static Constructor C# Structs C# enum C# Properties

C# Inheritance

C# Inheritance C# Multilevel Inheritance C# Aggregation C# Member overloading C# Method Overriding C# Base

C# Polymorphism

C# Polymorphism C# Sealed

C# Abstraction

C# Abstraction C# Interface

C# Namespace

C# Namespace C# Access Modifiers C# Encapsulation

C# Strings

C# String

C# Misc

C# Design Patterns Dictionary in C# Boxing and Unboxing in C# Ref and Out in C# Serialization in C# Dispose and Finalize in C# CONSOLE LOG IN C# Get File extension in C# Insert query in c# Difference Between List and Dictionary in C# Getters and Setters in C# Extension Methods in C# Insert query in c# CONSOLE LOG IN C# Get File extension in C# Random.NextDouble() Method in C# Binary Search in C# Difference between Delegates and Interfaces in C# Double.IsFinite() Method in C# Index Constructor in C# Abstraction in C# Basic OOPS Concepts In C# Queue.CopyTo() Method in C# single.compareto() method in C# C# Throw Exception in Constructor DECODE IN C# file.setlastwritetimeutc() method in C# Convert Object to List in C# convert.ToSByte(string, IFormatProvider) Method in C# C# Declare Delegate in Interface console.TreatControl C As Input property in C# Copying the queue elements to 1-D Array in C# Array.Constrainedcopy() Method in C# C# in and out Char.IsLetterOrDigit() method in C# Debugging in C# decimal.compare() method in C# Difference between Console.Read and Console.Readline in C# Metadata in C# C# Event Handler Example Default Interface Methods in C# Difference between hashtable and dictionary in C# C# program to implement IDisposable Interface Encapsulation in C# SortedList.IndexOfVaalue(Object) Method in C# Hash Maps in C# How to clear text files in C# How to Convert xls to xlsx in C# Foreach loop in C# FIFO in C# How to handle null exception in C# Type.Is Instance Of Type() Method in C# How to add data into MySQL database using C# How to use angular js in ASP net Csharp decimal.compare() method in Csharp Difference between Console.Read and Console.Readline in Csharp How to Implement Interface in Csharp char.IsUpper() Method in C# Index Of Any() Method in C# Quantifiers in C# C# program to Get Extension of a Given File C# Error Logging C# ENCRIPTION Can we create an object for Abstract Class in C# Console.CursorVisible in C# SortedDictionary Implementation in C# C# Hash Table with Examples Setting the Location of the Label in c# Collections in c# Virtual Keyword in C# Reverse of string in C# String and StringBuilder in C# Encapsulation in C# SortedList.IndexOfVaalue(Object) Method in C# Hash Maps in C# How to clear text files in C# How to Convert xls to xlsx in C# Foreach loop in C# FIFO in C# How to handle null exception in C# Type.Is Instance Of Type() Method in C# How to add data into MySQL database using C# How to use angular js in ASP net Csharp decimal.compare() method in Csharp Difference between Console.Read and Console.Readline in Csharp How to Implement Interface in Csharp char.IsUpper() Method in C# Index Of Any() Method in C# Quantifiers in C# C# program to Get Extension of a Given File Difference between ref and out in C# Singleton Class in C# Const And Readonly In Csharp BinaryReader and BinaryWriter in C# C# Attributes C# Delegates DirectoryInfo Class in C# Export and Import Excel Data in C# File Class in C# FileInfo Class in C# How to Cancel Parallel Operations in C#? Maximum Degree of Parallelism in C# Parallel Foreach Loop in C# Parallel Invoke in C# StreamReader and StreamWriter in C# TextReader and TextWriter in C# AsQueryable() in C# Basic Database Operations Using C# C# Anonymous Methods C# Events C# Generics C# Indexers C# Multidimensional Indexers C# Multithreading C# New Features C# Overloading of Indexers Difference between delegates and events in C# Operator overloading in C# Filter table in C# C# Queue with Examples C# Sortedlist With Examples C# Stack with Examples C# Unsafe Code File Handling in C# HashSet in C# with Examples List Implementation in C# SortedSet in C# with Examples C# in Depth Delegates and Events in C# Finally Block in C# How to Split String in C# Loggers in C# Nullable Types in C# REVERSE A STRING IN C# TYPE CASTING IN C# What is Generics in C# ABSTRACT CLASS IN C# Application of pointer in C# Await in c# READONLY AND CONSTANT IN C# Type safe in C# Types of Variables in c# Use of delegates in c# ABSTRACT CLASS IN C# Application of pointer in C# Await in c# READONLY AND CONSTANT IN C# Type safe in C# Types of Variables in c# Use of delegates in c# ABSTRACT CLASS IN C# Application of pointer in C# Await in c# READONLY AND CONSTANT IN C# Type safe in C# Types of Variables in c# Use of delegates in c# Atomic Methods Thread Safety and Race Conditions in C# Parallel LINQ in C# Design Principles in C# Difference Between Struct And Class In C# Difference between Abstraction and Encapsulation in C# Escape Sequence Characters in C# What is IOC in C# Multiple Catch blocks in C# Appdomain in C# Call back methods in C# Change Datetime format in C# Declare String array in C# Default Access Specifier in c# Foreach in LINQ C# How to compare two lists in C# How to Convert String to Datetime in c# How to get only Date from DateTime in C# Ispostback in asp net C# JSON OBJECT IN C# JSON STRINGIFY IN C# LAMBDA FUNCTION IN C# LINQ Lambda Expression in C# Microservices in C# MSIL IN C# Reference parameter in C# Shadowing(Method hiding) in C# Solid principles in C# Static Members in C# Task run in C# Transaction scope in C# Type Conversion in c# Unit of Work in C# Unit Test Cases in c# User Defined Exception in c# Using Keyword in C# Var Keyword in C# What is gac in C#

SortedDictionary Implementation in C#

The SortedDictionary class in C# is a collection type that represents a collection of key-value pairs. It is identical to the Dictionary class but differs significantly because SortedDictionary keeps the elements ordered according to the keys. The SortedDictionary objective is to offer an effective method for storing and retrieving key-value pairs while keeping a sorted order. It is frequently used when the order of the components matters, such as when you need to quickly discover elements based on their keys or iterate over the items in a particular order.

The functionality of SortedDictionary includes the capacity to insert, delete, and retrieve elements under their keys. Additionally, it enables many operations, like looking for a certain key or value, verifying the existence of a key, and iterating through the items in sorted order. Internally, SortedDictionary uses a binary search tree data structure to preserve the keys' sorted order. This makes insertion, deletion, and lookup operations efficient. The SortedDictionary's keys, which determine the elements' order, must be distinct from other keys. The keys are automatically sorted in ascending order when adding elements to a SortedDictionary.

Here is the syntax for creating a SortedDictionary

SortedDictionary<TKey, TValue> sortedDictionary = new SortedDictionary<TKey, TValue>();

The syntax has:

  • SortedDictionary is the name of the class.
  • <TKey, TValue> represents the generic type parameters for the key and value types. It would be best to replace TKey with the desired key type and TValue with the desired value type.
  • sortedDictionary is the variable's name that will hold the instance of the SortedDictionary.
  • new SortedDictionary<TKey, TValue>() is the constructor call to create a new instance of the SortedDictionary.

Here's the C# implementation of a SortedDictionary that demonstrates creating an instance, adding and removing elements, accessing and modifying elements, and iterating over the dictionary:

using System;

using System.Collections.Generic;

class Program

{

    static void Main()

    {

        // Creating an instance of SortedDictionary

        SortedDictionary<string, int> scores = new SortedDictionary<string, int>();

        // Adding elements to the SortedDictionary

        scores.Add("Vardhan", 90);

        scores.Add("Vikram", 85);

        scores.Add("Sai Reddy", 95);

        // Removing an element from the SortedDictionary

        scores.Remove("Vikram");

        // Accessing and modifying elements in the SortedDictionary

        int aliceScore = scores["Sai Reddy"];

        scores["Vardhan"] = 100;

        // Iterating over the SortedDictionary

        foreach (KeyValuePair<string, int> pair in scores)

        {

            Console.WriteLine(pair.Key + ": " + pair.Value);

        }

    }

}

Output:

 

In this example, a SortedDictionary object with string keys and int values is created. The Add method is used to add elements to the SortedDictionary. Using the Remove technique, we eliminate an element. Using the indexer [], we can access an element by its key and change it by giving it a new value. Finally, we use a foreach loop to go over the SortedDictionary and print the key-value pairs.

Sorting Behavior in SortedDictionary

Here is an illustration of how a SortedDictionary sorts and orders its entries.

using System;

using System.Collections.Generic;

class Program

{

    static void Main()

    {

        // Default sorting based on keys

        SortedDictionary<int, string> defaultSortedDict = new SortedDictionary<int, string>();

        defaultSortedDict.Add(3, "C");

        defaultSortedDict.Add(1, "A");

        defaultSortedDict.Add(2, "B");

        Console.WriteLine("Default SortedDictionary:");

        foreach (var pair in defaultSortedDict)

        {

            Console.WriteLine(pair.Key + ": " + pair.Value);

        }

        Console.WriteLine();

        // Custom sorting using Comparer or IComparer interface

        SortedDictionary<int, string> customSortedDict = new SortedDictionary<int, string>(new DescendingComparer());

        customSortedDict.Add(3, "C");

        customSortedDict.Add(1, "A");

        customSortedDict.Add(2, "B");

        Console.WriteLine("Custom SortedDictionary:");

        foreach (var pair in customSortedDict)

        {

            Console.WriteLine(pair.Key + ": " + pair.Value);

        }

    }

}

// Custom comparer for sorting in descending order

class DescendingComparer : IComparer<int>

{

    public int Compare(int x, int y)

    {

        return y.CompareTo(x);

    }

}

Output:

 

In this example, we first use the default constructor to create a SortedDictionary with int keys and string values. The elements are automatically sorted by the SortedDictionary according to their keys, ascending. We print each element after adding them with various keys.

The elements are then arranged in descending order using the keys in a new SortedDictionary made using a custom comparer called DescendingComparer. After adding them, we print them.

The sorting behaviour and order of the elements depending on the keys can be customised by passing a special comparer to the SortedDictionary constructor.

How to use different types of keys and values in SortedDictionary?

using System;

using System.Collections.Generic;

class Program

{

    static void Main()

    {

        // SortedDictionary with different types of keys and values

        SortedDictionary<string, int> dictionary = new SortedDictionary<string, int>();

        dictionary.Add("Mango", 10);

        dictionary.Add("Black Grapes", 5);

        dictionary.Add("Apples", 3);

        Console.WriteLine("SortedDictionary with different types for keys and values:");

        foreach (var pair in dictionary)

        {

            Console.WriteLine(pair.Key + ": " + pair.Value);

        }

    }

}

In this example, a SortedDictionary with string keys and int values is created. We add elements with keys that are strings that represent fruits and values that are integers that reflect the weights of the fruits. The key-value pairs are then printed after iterating over the dictionary. The output will be:

 

Choosing proper key types that facilitate comparison and sorting is crucial when using different types for keys and values. In this example, we employ naturally sortable keys: strings. The default ordering for value types, such as integers, is determined by their natural numeric order.

Both reference types and value types can be handled by the SortedDictionary class. Key-value pairs for value kinds are directly stored in the SortedDictionary. The SortedDictionary contains references to the items for reference types. It's important to remember that the SortedDictionary could not be aware of the change in ordering when adjusting reference types, such as changing the characteristics of an object used as a key. To preserve correct sorting and behaviour, it is suggested that you refrain from making changes to key objects after they have been added to the SortedDictionary.

Time Complexity

Add method: O(log n) average case, where n is the number of elements in the dictionary.

Remove method: O(log n) average case.

Searching for an element using the ContainsKey method: O(log n) average case.

Accessing an element using the indexer: O(log n) average case.

The SortedDictionary uses additional memory to preserve the order of the elements. Memory stores each entry in the SortedDictionary, including memory for the key, the value, and the underlying binary search tree structure. Comparing SortedDictionary to a standard Dictionary, the memory use is typically larger.

← Prev Next →