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.