ZetCode

C# HashSet

last modified April 2, 2021

C# HashSet tutorial shows how to work with a HashSet collection in C#.

HashSet

HashSet represents a set of values. It contains no duplicate elements. The collection models the mathematical set abstraction.

HashSet does not provide ordering of elements. If we need to maintain order, we can use the SortedSet collection.

C# HashSet count elements

The Count property returns the number of elements in the HashSet.

Program.cs
using System;
using System.Collections.Generic;

var brands = new HashSet<string>();

brands.Add("Wilson");
brands.Add("Nike");
brands.Add("Volvo");
brands.Add("IBM");
brands.Add("IBM");

int nOfElements = brands.Count;

Console.WriteLine($"The set contains {nOfElements} elements");
Console.WriteLine(string.Join(", ", brands));

We have a set of brands.

var brands = new HashSet<string>();

A new HashSet is created.

brands.Add("Wilson");

Elements are added to the set with the Add method.

int nOfElements = brands.Count;

We get the number of elements with the Count property.

$ dotnet run
The set contains 4 elements
Wilson, Nike, Volvo, IBM

C# HashSet removing elements

In the next example, we remove elements from a HashSet.

Program.cs
using System;
using System.Collections.Generic;

var brands = new HashSet<string>
{
    "Wilson", "Nike", "Volvo", "Kia", "Lenovo"
};

Console.WriteLine(string.Join(", ", brands));

brands.Remove("Kia");
brands.Remove("Lenovo");

Console.WriteLine(string.Join(", ", brands));

brands.Clear();

if (brands.Count == 0)
{
    Console.WriteLine("The brands set is empty");
}

var words = new HashSet<string>
{
    "sky", "blue", "cup", "cold", "cloud", "pen", "bank"
};

words.RemoveWhere(word => word.Length == 3);
Console.WriteLine(string.Join(", ", words));

The elements are removed with Remove, Clear, and RemoveWhere.

brands.Remove("Kia");

A single element is removed with Remove.

brands.Clear();

All elements are removed with Clear.

words.RemoveWhere(word => word.Length == 3);

With RemoveWhere, we remove elements that satisfy the given condition.

$ dotnet run
Wilson, Nike, Volvo, Kia, Lenovo
Wilson, Nike, Volvo
The brands set is empty
blue, cold, cloud, bank

C# HashSet loop

We can loop over HashSet with foreach and while keywords.

Program.cs
using System;
using System.Collections.Generic;

var words = new HashSet<string>
{
    "sky", "blue", "cup", "cold", "cloud", "pen", "bank"
};

foreach (var word in words)
{
    Console.WriteLine(word);
}

Console.WriteLine("----------------------");

var it = words.GetEnumerator();

while (it.MoveNext())
{
    Console.WriteLine(it.Current);
}

In the example, we iterate over a HashSet of words with foreach and while.

$ dotnet run
sky
blue
cup
cold
cloud
pen
bank
----------------------
sky
blue
cup
cold
cloud
pen
bank

C# HashSet Contains

The Contains method determines whether a HashSet contains the specified element.

Program.cs
using System;
using System.Collections.Generic;

var words = new HashSet<string>
{
    "sky", "blue", "cup", "cold", "cloud", "pen", "bank"
};

Console.WriteLine(words.Contains("sky"));
Console.WriteLine(words.Contains("water"));

Console.WriteLine("-----------------");

var users = new HashSet<User>
{
    new User("John Doe", "gardener"),
    new User("Roger Roe", "driver"),
    new User("Lucy Smith", "teacher")
};

var u1 = new User("John Doe", "gardener");
var u2 = new User("Jane Doe", "student");

Console.WriteLine(users.Contains(u1));
Console.WriteLine(users.Contains(u2));

record User(string name, string occupation);

We have two HashSet collections.

var words = new HashSet<string>
{
    "sky", "blue", "cup", "cold", "cloud", "pen", "bank"
};

Console.WriteLine(words.Contains("sky"));
Console.WriteLine(words.Contains("water"));

We check if a HashSet of words contains these the specified two words.

var u1 = new User("John Doe", "gardener");
var u2 = new User("Jane Doe", "student");

Console.WriteLine(users.Contains(u1));
Console.WriteLine(users.Contains(u2));

C# record contains a default implementation of the Equals and the GetHashCode methods; therefore, the Contains method works as we would expect.

$ dotnet run
True
False
-----------------
True
False

In case of a class, we need to implement the Equals and the GetHashCode methods.

Program.cs
using System;
using System.Collections.Generic;

var users = new HashSet<User>
{
    new User("John Doe", "gardener"),
    new User("Roger Roe", "driver"),
    new User("Lucy Smith", "teacher")
};

var u1 = new User("John Doe", "gardener");
var u2 = new User("Jane Doe", "student");

Console.WriteLine(users.Contains(u1));
Console.WriteLine(users.Contains(u2));

class User
{
    string Name { get; set; }
    string Occupation { get; set; }

    public User(string name, string occupation) 
        => (Name, Occupation) = (name, occupation);

    public override bool Equals(object obj)
    {
        return obj is User user &&
               Name == user.Name;
    }

    public override int GetHashCode()
    {
        return HashCode.Combine(Name);
    }
}

In this example, we have a HashSet of user objects. Since the object is defined with the class keyword, we add the implementation of the Equals and GetHashCode methods.

$ dotnet run
True
False

C# HashSet

HashSet contains a set of methods specific to a set.

Program.cs
using System;
using System.Collections.Generic;

var vals1 = new HashSet<int> { 1, 2, 3, 4, 5 };
var vals2 = new HashSet<int> { 6, 7, 8, 9, 10 };

vals1.UnionWith(vals2);
Console.WriteLine(string.Join(", ", vals1));

var vals3 = new HashSet<int> { 1, 2, 3, 4, 5 };
var vals4 = new HashSet<int> { 3, 4, 5, 6, 7 };

vals3.IntersectWith(vals4);
Console.WriteLine(string.Join(", ", vals3));

We use UnionWith and IntersectWith methods.

vals1.UnionWith(vals2);

The UnionWith method modifies the HashSet object to contain elements from both sets.

vals3.IntersectWith(vals4);

The IntersectWith method modifies the HashSet object to contain elements that are present in both objects.

$ dotnet run
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
3, 4, 5

C# SortSet

The SortedSet represents a set of objects that is maintained in sorted order.

Program.cs
using System;
using System.Collections.Generic;

var vals = new SortedSet<int> { 5, 2, 1, 4, 3, 7, 6 };
Console.WriteLine(string.Join(", ", vals));

var words = new SortedSet<string>
{
    "sky", "blue", "cup", "cold", "cloud", "pen", "bank"
};

Console.WriteLine(string.Join(", ", words));

var users = new SortedSet<User>
{
    new User("Robin", "bookseller"),
    new User("John", "gardener"),
    new User("John", "writer"),
    new User("Janet", "teacher"),
    new User("Andrew", "driver"),
    new User("Lucy", "accountant")
};

Console.WriteLine(string.Join("\n", users));

record User(string Name, string Occupation) : IComparable<User>
{
    public int CompareTo(User other)
    {
        return this.Occupation.CompareTo(other.Occupation);
    }
}

We have SortedSet of integers, strings, and users.

$ dotnet run
1, 2, 3, 4, 5, 6, 7
bank, blue, cloud, cold, cup, pen, sky
User { Name = Lucy, Occupation = accountant }
User { Name = Robin, Occupation = bookseller }
User { Name = Andrew, Occupation = driver }
User { Name = John, Occupation = gardener }
User { Name = Janet, Occupation = teacher }
User { Name = John, Occupation = writer }

In this tutorial, we have worked with C# HashSet.

List all C# tutorials.