遍历 ICollection 并设置为 null

use*_*893 1 c# collections loops

如果集合的 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();
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

我得到的错误:"This expression cannot be used as an assignment target"

我怎样才能使这项工作?

Jon*_*eet 5

你不能,基本上 -不仅仅是 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

在大多数情况下,您已经有了ICollection<T>,您会发现它已经实现了IList<T>。如果不是,您需要仔细查看集合实际上什么,并考虑“在同一索引处替换”是否有意义。(HashSet<,>例如,如果它是,您可以删除现有项目并添加一个新项目...)

编辑:如果您只需要删除项目,则可以使用以下Remove方法:

var itemsToRemove = collection.Where(c => c.ToolID == notSelectedToolId).ToList();
                              .ToList();
foreach (var item in itemsToRemove)
{
    collection.Remove(item);
}
Run Code Online (Sandbox Code Playgroud)

此外,您不需要嵌套循环 - 您可以使用以下内容:

var itemsToRemove = collection.Where(c => notSelectedToolIds.Contains(c.ToolID))
Run Code Online (Sandbox Code Playgroud)

在一次通过中找到所有要删除的内容(然后如上所述删除它们)。

  • @haim770:不。LINQ 用于查询,而不是修改集合。 (2认同)