循环遍历 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 并设置为 null

基本上你不能 - 不仅仅是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();