2012-10-19 13 views
13

linqを使用してリストからアイテムを削除するには?linqを使用してリストからアイテムを削除します

私はアイテムのリストを持っていて、それ自身は他のアイテムのリストを持っています。 もっと明確にするためにコードを確認してください。

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

} 

答えて

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

または

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

だけを指摘して、LINQは、データを照会するためであり、あなたが実際に元の容器から要素を削除しません。最後に_lstBase.Remove(item)を使用する必要があります。あなたができることは、LINQを使ってそれらのアイテムを見つけることです。

私は、あなたが何らかの種類のINotifyパターンを使用していると仮定しています。パターンが壊れていて、_lstBaseをフィルタリングされたバージョンに置き換えています。 _lstBaseを置き換えることができる場合は、@ 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); 
} 
関連する問題