Easy collection comparing in C#

Copmare collections in C# the easy way

Collections are part of pretty much any application and they are convenient to store any type of data. Introducing LINQ in .NET things got a lot easier as your code does not need to be full with loops for performing simple operations on collections of any type. However some simple operations like equality regardless of the item position in collection are not part of every collection in .NET.

One useful class introduced in .NET framework is HashSet. This type of collection has implemented various method for comparing the collections of same type. This is nice to use in case you are writing your application from the scratch, but in case you have application with dozens of different collections, things get messy when you want to perform some of the operations available in HashSet collections.

This is the case for using extension methods to extend generic collection functionalities. Below are three methods that I found very useful in collection operations which are basically using HashSets under the hood.

using System.Collections.Generic;
using System.Linq;

namespace MultiConsoleOutput
{
    public static class ExtensionMethods
    {
        public static bool IsEqual<T>(this IEnumerable<T> comparing, IEnumerable<T> compareTo)
        {
            if (comparing.Count() == compareTo.Count())
            {
                return new HashSet<T>(comparing).Intersect<T>(compareTo).Any();
            }
            return false;
        }

        public static bool Contains<T>(this IEnumerable<T> comparing, IEnumerable<T> compareTo)
        {
            return new HashSet<T>(comparing).IsSupersetOf(compareTo);
        }

        public static bool ContainedIn<T>(this IEnumerable<T> comparing, IEnumerable<T> compareTo)
        {
            return new HashSet<T>(comparing).IsSubsetOf(compareTo);
        }
    }
}

    

To demonstrate functionality of these methods lets take IsEqual extension method which uses the HashSet to compare two collections regardless of the element position in collection.

            List<int> list1 = new List<int>() { 1, 2, 3, 4, 5, 6 };
            List<int> list2 = new List<int>() { 2, 3, 6, 5, 1, 4 };

            Console.WriteLine(list1.Equals(list2)); //False
            Console.WriteLine(list1.IsEqual(list2)); //True
    

You can see that Equals method returned result False while IsEqual returns True. Basically these are two same collections, just with different element order. The same goes for Contains method for collection which only accepts one parameter of the same type to determine whether collection contains element while Contains extension method accepts collection which will use for comparing by translating collection to HashSet under the hood.

References

Disclaimer

Purpose of the code contained in snippets or available for download in this article is solely for learning and demo purposes. Author will not be held responsible for any failure or damages caused due to any other usage.


About the author

DEJAN STOJANOVIC

Dejan is a passionate Software Architect/Developer. He is highly experienced in .NET programming platform including ASP.NET MVC and WebApi. He likes working on new technologies and exciting challenging projects

CONNECT WITH DEJAN  Loginlinkedin Logintwitter Logingoogleplus Logingoogleplus

JavaScript

read more

SQL/T-SQL

read more

Umbraco CMS

read more

PowerShell

read more

Comments for this article