c# - 遍历 ICollection 并设置为 null

标签 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”

我怎样才能让它工作?

最佳答案

你不能,基本上 - 不是 just 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))

一次性找到所有要删除的对象(然后如上所述删除它们)。

关于c# - 遍历 ICollection 并设置为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27133653/

相关文章:

c# - 将附加属性传递给 EditorTemplate

c# - PuppeteerSharp 和页面级代理

bash - 使用循环变量名称重命名文件

python - 循环内独立随机洗牌

java - 如何在 java 中通过键-> 集合映射流式传输,其中每个流式元素都是键和集合中的每个元素?

python - 如何在 python 中为非基于整数的索引构建 2D 查找

c# - 如何设置机箱风扇速度

c# - 在 C# Winforms 中,让异步方法保证其在 UI 线程上执行的最精确方法是什么?

jquery - 使用 "click"函数循环数组

java - 编写一个函数,给定一个非负整数列表,将它们排列成最大可能的数