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 list is null, return false
if ((list1 == null && list2 != null) || (list2 == null && list1 != null))
return false;
//if both lists are null, return true, since its same
else if (list1 == null && list2 == null)
return true;
//if count don't match between 2 lists, then 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 object inside list is null and 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 value inside an object in the list didnt match, return false
if (Object1Value.Trim() != Object2Value.Trim())
{
IsEqual = false;
break;
}
}
}
}
//if all the properties are 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.
Now I compared a few combinations to verify that the method is working in the page_load event.
//compare 2 lists with different counts
bool same = s1.com
//bool same = s1.CompareList(s2);
//compare 2 lists with same number of objects but one of the property inside an object is
different. Student id property
bool same1 = s1.CompareList(s3);
//compare 2 lists with same count and values
bool same2 = s1.CompareList(s4);
//compare 2 lists with same number of objects but one of the property inside an object is different.Age property
bool same3 = s1.CompareList(s5);
//compare 2 lists in which a list is null
List<Student> s6= null;
bool same4 = s1.CompareList(s6);
List<Student> s7= null;
//compare 2 lists and both are null
bool same5 = s6.CompareList(s7);
s1 = new List<Student>()
{
new Student(){studentId=100,age=21},
new Student(){studentId=101,age=21},
null
};
//compare 2 lists in which one of the object 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.