Custom Extension Method to Compare List in C#

Introduction

In this article, we will see how to create a custom extension method to compare 2 lists in C#.

Custom Extension Method

Create a static class ExtensionDemo. Inside that, have a static method "CompareList" of generic type and return type of bool. Make sure to have 2 List parameters and the first one should have "this" keyword. This parameter here refers to the list in which you are able to see this custom extension method.

I have used the system.reflection.propertyinfo namespace to compare each property in an object. To know more about comparing properties inside 2 objects using Properties, please check this article.

public static class ExtensionDemo
{
    public static bool CompareList<T>(this List<T> list1, List<T> list2)
    {
        // If any of the lists is null, return false
        if ((list1 == null && list2 != null) || (list2 == null && list1 != null))
            return false;

        // If both lists are null, return true since they are the same
        else if (list1 == null && list2 == null)
            return true;

        // If the counts don't match between the two lists, return false
        if (list1.Count != list2.Count)
            return false;

        bool IsEqual = true;

        foreach (T item in list1)
        {
            T Object1 = item;
            T Object2 = list2.ElementAt(list1.IndexOf(item));
            Type type = typeof(T);

            // If any of the objects inside the list is null and the other list has some value for the same object, then return false
            if ((Object1 == null && Object2 != null) || (Object2 == null && Object1 != null))
            {
                IsEqual = false;
                break;
            }

            foreach (System.Reflection.PropertyInfo property in type.GetProperties())
            {
                if (property.Name != "ExtensionData")
                {
                    string Object1Value = string.Empty;
                    string Object2Value = string.Empty;

                    if (type.GetProperty(property.Name).GetValue(Object1, null) != null)
                        Object1Value = type.GetProperty(property.Name).GetValue(Object1, null).ToString();

                    if (type.GetProperty(property.Name).GetValue(Object2, null) != null)
                        Object2Value = type.GetProperty(property.Name).GetValue(Object2, null).ToString();

                    // If any of the property values inside an object in the list didn't match, return false
                    if (Object1Value.Trim() != Object2Value.Trim())
                    {
                        IsEqual = false;
                        break;
                    }
                }
            }
        }

        // If all the properties are the same, then return true
        return IsEqual;
    }
}

How to use the created custom extension method.

To test this, we have to create a new Web/Window/Console project. I am using a web application. I have created a student class as shown below in the same namespace.

public class Student
{
    public int? StudentId { get; set; }
    public int Age { get; set; }
}

Now in page_load event, create a list of objects for students.

protected void Page_Load(object sender, EventArgs e)
{
    List<Student> s1 = new List<Student>()
    {
        new Student() { studentId = 100, age = 21 },
        new Student() { studentId = 101, age = 21 },
        new Student() { studentId = 102, age = 21 }
    };

    List<Student> s2 = new List<Student>()
    {
        new Student() { studentId = 100, age = 21 },
        new Student() { studentId = 101, age = 21 },
        null
    };

    List<Student> s3 = new List<Student>()
    {
        new Student() { studentId = 100, age = 21 },
        new Student() { studentId = 102, age = 21 },
        new Student() { studentId = 102, age = 21 }
    };

    List<Student> s4 = new List<Student>()
    {
        new Student() { studentId = 100, age = 21 },
        new Student() { studentId = 101, age = 21 },
        new Student() { studentId = 102, age = 21 }
    };

    List<Student> s5 = new List<Student>()
    {
        new Student() { studentId = 100, age = 21 },
        new Student() { studentId = 101, age = 21 },
        new Student() { studentId = 102, age = 22 }
    };
}

Now we are going to compare 2 lists using the extension method. You will be able to see the created custom extension in the list of extension methods for list s1 as below.

ext.jpg

Now I compared a few combinations to verify that the method is working in the page_load event.

// Compare two lists with different counts
bool same = s1.CompareList(s2);

// Compare two lists with the same number of objects but one of the properties inside an object is different (Student ID property)
bool same1 = s1.CompareList(s3);

// Compare two lists with the same count and values
bool same2 = s1.CompareList(s4);

// Compare two lists with the same number of objects but one of the properties inside an object is different (Age property)
bool same3 = s1.CompareList(s5);

// Compare two lists in which one of the lists is null
List<Student> s6 = null;
bool same4 = s1.CompareList(s6);

// Compare two lists, both of which are null
List<Student> s7 = null;
bool same5 = s6.CompareList(s7);

// Reinitialize s1
s1 = new List<Student>()
{
    new Student() { studentId = 100, age = 21 },
    new Student() { studentId = 101, age = 21 },
    null
};

// Compare two lists in which one of the objects inside a list is null
bool same6 = s1.CompareList(s4);

While debugging, same2 and same5 will return true, all the remaining items will return false.

Please find the attached complete source code.


Similar Articles