Difference between two lists
Solution 1:
Using Except
is exactly the right way to go. If your type overrides Equals
and GetHashCode
, or you're only interested in reference type equality (i.e. two references are only "equal" if they refer to the exact same object), you can just use:
var list3 = list1.Except(list2).ToList();
If you need to express a custom idea of equality, e.g. by ID, you'll need to implement IEqualityComparer<T>
. For example:
public class IdComparer : IEqualityComparer<CustomObject>
{
public int GetHashCode(CustomObject co)
{
if (co == null)
{
return 0;
}
return co.Id.GetHashCode();
}
public bool Equals(CustomObject x1, CustomObject x2)
{
if (object.ReferenceEquals(x1, x2))
{
return true;
}
if (object.ReferenceEquals(x1, null) ||
object.ReferenceEquals(x2, null))
{
return false;
}
return x1.Id == x2.Id;
}
}
Then use:
var list3 = list1.Except(list2, new IdComparer()).ToList();
Note that this will remove any duplicate elements. If you need duplicates to be preserved, it would probably be easiest to create a set from list2
and use something like:
var list3 = list1.Where(x => !set2.Contains(x)).ToList();
Solution 2:
You could do something like this:
var result = customlist.Where(p => !otherlist.Any(l => p.someproperty == l.someproperty));