2012-10-19 12 views
13

Jak usunąć pozycję z listy za pomocą linq?.Usuń pozycję z listy używając linq

Mam listę przedmiotów i każdy przedmiot, który sam ma listę innych przedmiotów teraz chcę chaeck, jeśli inne elementy zawiera jakiekolwiek elementy z podanej listy, więc główny element powinien zostać usunięty. Proszę sprawdzić kod, aby uzyskać większą przejrzystość.

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)); 

} 

Odpowiedz

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

lub

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

Wystarczy wskazać, LINQ jest do pobierania danych i nie będzie faktycznie usunąć element z oryginalnego pojemnika. Na końcu będziesz musiał użyć _lstBase.Remove(item). Możesz użyć LINQ, aby znaleźć te przedmioty.

Zakładam, że używasz pewnego rodzaju wzorca INotify, w którym łamanie szablonów ma zastąpić _lstBase filtrowaną wersją samego siebie. Jeśli możesz zastąpić _lstBase, przejdź do odpowiedzi @ 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); 
}