2012-10-19 8 views
13

Come rimuovere l'elemento dall'elenco utilizzando linq?.Rimuovi l'elemento dall'elenco utilizzando linq

Ho un elenco di elementi e ogni elemento ha una lista di altri elementi ora voglio testare se altri elementi contengono elementi della lista passata quindi l'elemento principale dovrebbe essere rimosso. Controllare il codice per maggiore chiarezza.

public Class BaseItems 
{ 
    public int ID { get; set; } 
    public List<IAppointment> Appointmerts { get; set; } 
} 

Public DeleteApp(List<IAppointment> appointmentsToCheck) 
{ 
    List<BaseItems> _lstBase ; // is having list of appointments 

    //now I want to remove all items from _lstBase which _lstBase.Appointmerts contains 
    any item of appointmentsToCheck (appointmentsToCheck item and BaseItems.Appointmerts 
    item is having a same reference) 

    //_lstBase.RemoveAll(a => a.Appointmerts.Contains(//any item from appointmentsToCheck)); 

} 

risposta

21
_lstBase 
    .RemoveAll(a => a.Appointmerts.Any(item => appointmentsToCheck.Contains(item))); 
3
var data = 
    _lstBase. 
    Except(a => a.Appointmerts.Any 
     (item => appointmentsToCheck.Contains(item))); 

o

var data = 
    _lstBase. 
    Where(a => !a.Appointmerts.Any 
     (item => appointmentsToCheck.Contains(item))); 
7

Giusto per sottolineare, LINQ è per interrogare i dati e non sarà effettivamente rimuovere l'elemento dal contenitore originale. Dovrai usare _lstBase.Remove(item) alla fine. Quello che puoi fare è usare LINQ per trovare quegli oggetti.

Suppongo che si stia utilizzando un tipo di schema di INotify in cui è la rottura del modello per sostituire _lstBase con una versione filtrata di sé. Se è possibile sostituire _lstBase, andare con la risposta di @ JanP.

List<BaseItems> _lstBase ; // populated original list 

Public DeleteApp(List<IAppointment> appointmentsToCheck) 
{ 
    // Find the base objects to remove 
    var toRemove = _lstBase.Where(bi => bi.Appointments.Any 
       (app => appointmentsToCheck.Contains(app))); 
    // Remove em! 
    foreach (var bi in toRemove) 
    _lstBase.Remove(bi); 
}