Tags

, ,

Credit goes: http://stackoverflow.com/questions/19790211/comparing-two-lists-according-to-specific-properties

.Net Except with IEqualityComparer

// define the Animal class
public class Animal
{
	public Guid Id { get; set; }
	public string AnimalName { get; set; }
	public bool HasTail { get; set; }
}

And then have the following, expect that these two list should be equal to each other, but actually not

var id = Guid.NewGuid();
var animalList1 = new List<Animal>{new Animal { Id=id, AnimalName="cat", HasTail=true}};
var animalList2 = new List<Animal>{new Animal { Id=id, AnimalName="cat", HasTail=true}};

var isSame = !animalList1.Except(animalList2).Any() // expect to be true, but it's false;

In this case, need to implement it’s own IEqualityComparer

public class AnimalComparer : IEqualityComparer<Animal>
{
    ///
<summary>
    /// Implement the Equals methods
    /// </summary>

    /// <param name="x"></param>
    /// <param name="y"></param>
    /// <returns></returns>
    public bool Equals(Animal x, Animal y)
    {
        return x.Id.Equals(y.Id) && x.AnimalName.Equals(y.AnimalName) && x.HasTail == y.HasTail;
    }

    ///
<summary>
    /// Implement its own GetHashCode method
    /// </summary>

    /// <param name="x"></param>
    /// <returns></returns>
    public int GetHashCode(Animal x)
    {
        unchecked
        {
            int hash = 17;
            hash = hash * 23 + x.Id.GetHashCode();
            hash = hash * 23 + x.AnimalName.GetHashCode();
            hash = hash * 23 + x.HasTail.GetHashCode();
            return hash;
        }
    }
}

And now if compare these two lists by using its own comparer, it will succeed

var isSame = !animalList1.Except(animalList2, new AnimalComparer()).Any(); // Now will be true
Advertisements