Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using Linq Except not Working as I Thought

List1 contains items { A, B } and List2 contains items { A, B, C }.

What I need is to be returned { C } when I use Except Linq extension. Instead I get returned { A, B } and if I flip the lists around in my expression the result is { A, B, C }.

Am I misunderstanding the point of Except? Is there another extension I am not seeing to use?

I have looked through and tried a number of different posts on this matter with no success thus far.

var except = List1.Except(List2); //This is the line I have thus far

EDIT: Yes I was comparing simple objects. I have never used IEqualityComparer, it was interesting to learn about.

Thanks all for the help. The problem was not implementing the comparer. The linked blog post and example below where helpful.

like image 737
Schanckopotamus Avatar asked May 29 '13 22:05

Schanckopotamus


People also ask

How to use Except in LINQ?

The Except() method requires two collections. It returns a new collection with elements from the first collection which do not exist in the second collection (parameter collection). Except extension method doesn't return the correct result for the collection of complex types.

When should we use LINQ?

LINQ in C# is used to work with data access from sources such as objects, data sets, SQL Server, and XML. LINQ stands for Language Integrated Query. LINQ is a data querying API with SQL like query syntaxes. LINQ provides functions to query cached data from all kinds of data sources.

How does Linq any work?

The C# Linq Any Operator is used to check whether at least one of the elements of a data source satisfies a given condition or not. If any of the elements satisfy the given condition, then it returns true else return false. It is also used to check whether a collection contains some data or not.


1 Answers

If you are storing reference types in your list, you have to make sure there is a way to compare the objects for equality. Otherwise they will be checked by comparing if they refer to same address.

You can implement IEqualityComparer<T> and send it as a parameter to Except() function. Here's a blog post you may find helpful.

edit: the original blog post link was broken and has been replaced above

like image 147
Ufuk Hacıoğulları Avatar answered Oct 05 '22 03:10

Ufuk Hacıoğulları