Subtract a generic list from another

I am trying remove a list of firmIDs from one list from another. I don't really understand linq but I am pretty sure I need to use it.

List<Firm> firms = GetBusinessDevelopmentFirms(database);
List<Firm> trackedFirms = GetAllCLIFirmsBeingTrackedByUser();

var result = firms.Contains(i => trackedFirms.Contains(i.FirmID));

The last line doesn't work and the system says "unknown method Contains(?)" even though I have put "using System.Linq;" At the top of the class.

My idea was to remove a list of tracked firms from a list of all firms to find the untracked firms.

I hope this makes sense.


Solution 1:

var result = firms.Except(trackedFirms); // returns all the firms except those in trackedFirms

Solution 2:

From your code above, I presume you are trying to get entries from Firms that have a corresponding item in TrackedFirms.

List<Firm> results = Firms.Where(f => TrackedFirms.Any(t => t.FirmId == f.FirmId)).ToList();

If on the other hand you want untracked firms, then it's :

List<Firm> results = Firms.Where(f => !TrackedFirms.Any(t => t.FirmId == f.FirmId)).ToList();

Solution 3:

I think this should works

var result = firms.Where(x => !trackedFirms.Any(y => x.FirmID == y.FirmID));

From all the firm in firms select the firm that isn't in the trackedFirms (at least this is what i understand from your question).

Solution 4:

Contains is the native method of List<T> that expects you to pass in a T. You want Where instead.

var result = firms.Where(i => trackedFirms.Contains(i.FirmID));

If you expect result to be a List<T> then add .ToList() to the end of your Where LINQ expression.