如何使用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));
}
答案 0 :(得分:21)
_lstBase
.RemoveAll(a => a.Appointmerts.Any(item => appointmentsToCheck.Contains(item)));
答案 1 :(得分: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);
}
答案 2 :(得分: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)));