循环通过ICollection并设置为null

时间:2014-11-25 18:04:09

标签: c# loops collections

如果集合的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"

我该如何做到这一点?

2 个答案:

答案 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();