循环遍历 ICollection 并设置为 null
本文关键字:null 设置 遍历 ICollection 循环 | 更新日期: 2023-09-27 18:31:51
如果集合的 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"
.
我怎样才能做到这一点?
基本上你不能 - 不仅仅是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))
以在一次传递中找到要删除的所有内容(然后按上述方式删除它们)。
可以使用 LINQ 将筛选器应用于matchingHoleInfoVm.ToolHeader
以返回新列表。类似的东西
var toolsExlcuded = matchingHoleInfoVm.ToolHeader.Where(x => !notSelectedToolIds.Contains(x.ToolId)).ToList();