Sottrai una lista generica da un’altra

Sto provando a rimuovere una lista di firmID da una lista all’altra. Non capisco veramente linq ma sono abbastanza sicuro di aver bisogno di usarlo.

List firms = GetBusinessDevelopmentFirms(database); List trackedFirms = GetAllCLIFirmsBeingTrackedByUser(); var result = firms.Contains(i => trackedFirms.Contains(i.FirmID)); 

L’ultima riga non funziona e il sistema dice “metodo sconosciuto Contiene (?)” Anche se ho messo “using System.Linq;” Al vertice della class.

La mia idea era quella di rimuovere un elenco di aziende monitorate da un elenco di tutte le aziende per trovare le aziende non tracciate.

Spero che abbia senso.

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

Dal tuo codice sopra, presumo tu stia cercando di ottenere le voci da Aziende che hanno un object corrispondente in TrackedFirms.

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

Se invece vuoi aziende non controllate, allora è:

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

Penso che questo dovrebbe funzionare

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

Da tutte le firms in firms selezionare l’azienda che non è nelle trackedFirms (almeno questo è ciò che ho capito dalla tua domanda).

Contains è il metodo nativo di List che si aspetta che tu passi in una T Tu vuoi Where invece.

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

Se ti aspetti che il result sia un List aggiungi .ToList() alla fine della tua espressione Where LINQ.

Se hai la lista X e una lista Y, e vuoi rimuovere tutti gli elementi in Y che si trovano in X, puoi sperimentare quanto segue:

X.Intersect (Y)

Confronto di due elenchi e ritorno dei valori distinti e delle differenze

L’approccio migliore sarebbe Except() per te. Tuttavia, se l’object List è diverso dall’altra, puoi usare All()

 firms.Where(x=> trackedFirms.All(y => y.FirmId != x.FirmId)