如果集合的ID在ID列表中,我需要从ICollection中删除数据。
到目前为止我所拥有的:
foreach (var notSelectedToolId in notSelectedToolIds)
{
for (int i = 0; i < matchingHoleInfoVm.ToolHeader.Count; i++)
{
if (matchingHoleInfoVm.ToolHeader.ElementAt(i).ToolID == notSelectedToolId)
{
matchingHoleInfoVm.ToolHeader.ElementAt(i) = new ToolHeaderViewModel();
}
}
}
我得到的错误:"This expression cannot be used as an assignment target"
。
我该如何做到这一点?
答案 0 :(得分:4)
你不能,基本上 - 不能只 ICollection
(甚至ICollection<T>
)。它们都不允许您用新的元素替换现有元素。
使用IList<T>
,非常简单:
var list = matchingHoleInfoVm.ToolHeader;
for (int i = 0; i < list.Count; i++)
{
if (list[i].ToolID == notSelectedToolId)
{
list[i] = new ToolHeaderViewModel();
}
}
在您已经拥有ICollection<T>
的大多数情况下,您会发现它已经实现了IList<T>
。如果没有,您需要仔细查看实际 的集合,并考虑“在同一索引处替换”是否有意义。 (例如,如果它是HashSet<,>
,您可以删除现有项目并添加新项目......)
编辑:如果您只需删除这些项目,则可以使用Remove
方法:
var itemsToRemove = collection.Where(c => c.ToolID == notSelectedToolId).ToList();
.ToList();
foreach (var item in itemsToRemove)
{
collection.Remove(item);
}
此外,您不需要嵌套循环 - 您可以使用以下内容:
var itemsToRemove = collection.Where(c => notSelectedToolIds.Contains(c.ToolID))
在一次传递中找到要删除的所有(然后按上述方法删除它们)。
答案 1 :(得分:1)
您可以使用LINQ将过滤器应用于matchingHoleInfoVm.ToolHeader
以返回新列表。像
var toolsExlcuded = matchingHoleInfoVm.ToolHeader.Where(x => !notSelectedToolIds.Contains(x.ToolId)).ToList();