c# hashset of objects

c# hashset of objects
In this article [Show more]

    C# HashSet of Objects

    In C#, HashSet<T> is a generic collection designed to manage unique elements efficiently. When dealing with objects, a HashSet can ensure uniqueness based on the object's properties by leveraging the GetHashCode and Equals methods. This article will explore how to create a HashSet of objects, implement proper equality comparisons, and manage the collection effectively.

    Why Use a HashSet for Objects?

    • Uniqueness: Guarantees that no duplicate objects exist based on specified properties.
    • Performance: Offers constant-time O(1) operations for adding and searching, making it suitable for large collections.

    Implementing a HashSet of Objects

    Creating a Custom Object

    To store objects in a HashSet, a class must override GetHashCode and Equals to ensure proper uniqueness comparisons. Here's an example with a custom Person class:

     

    using System;
    using System.Collections.Generic;
    
    public class Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int Age { get; set; }
    
        // Override GetHashCode to create a unique hash code
        public override int GetHashCode()
        {
            return HashCode.Combine(FirstName, LastName, Age);
        }
    
        // Override Equals to define when two objects are considered equal
        public override bool Equals(object obj)
        {
            if (obj is Person otherPerson)
            {
                return FirstName == otherPerson.FirstName &&
                       LastName == otherPerson.LastName &&
                       Age == otherPerson.Age;
            }
            return false;
        }
    }
    

    Using HashSet with the Custom Object

    Now that the Person class correctly implements equality comparison, you can use it within a HashSet.

     

    public class HashSetObjectsExample
    {
        public static void Main()
        {
            // Create a HashSet of Person objects
            HashSet<Person> people = new HashSet<Person>
            {
                new Person { FirstName = "John", LastName = "Doe", Age = 30 },
                new Person { FirstName = "Jane", LastName = "Doe", Age = 28 },
                new Person { FirstName = "John", LastName = "Doe", Age = 30 } // Duplicate
            };
    
            // Add a new person
            people.Add(new Person { FirstName = "Alice", LastName = "Smith", Age = 25 });
    
            // Attempt to add a duplicate
            bool added = people.Add(new Person { FirstName = "Jane", LastName = "Doe", Age = 28 });
            Console.WriteLine("Was the duplicate person added? " + added); // Outputs: False
    
            // Display all unique people
            Console.WriteLine("Unique people in the HashSet:");
            foreach (Person person in people)
            {
                Console.WriteLine($"{person.FirstName} {person.LastName}, Age: {person.Age}");
            }
        }
    }
    

    Handling Custom Comparisons

    • Custom Comparer: Implement IEqualityComparer<T> if objects need to be compared differently without modifying their internal code.

    Practical Applications

    • Entity Management: Avoid duplicate entries in collections representing unique entities like users or products.
    • Filtering Data: Use a HashSet to filter out duplicate or redundant objects efficiently.
    • Set Operations: Perform union, intersection, or difference operations on sets of objects.

    Conclusion

    Using a HashSet for objects in C# allows developers to manage unique collections effectively by overriding GetHashCode and Equals methods. Understanding and implementing these methods correctly will help ensure accurate comparisons and optimal performance.

    Author Information
    • Author: Ehsan Babaei

    Send Comment



    Comments