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"。
我怎样才能使这项工作?
你不能,基本上 -不仅仅是 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)
在一次通过中找到所有要删除的内容(然后如上所述删除它们)。