代码之家  ›  专栏  ›  技术社区  ›  Sarah Vessels

使用Linq生成要从另一个集合中删除的内容集合

  •  4
  • Sarah Vessels  · 技术社区  · 15 年前

    我很熟悉在使用 foreach

    之前的代码,该代码引发了异常:

    IEnumerable<Guid> keysToDelete = _outConnections.Where(
        pair => pair.Value < timeoutPoint
    ).Select(pair => pair.Key);
    
    foreach (Guid key in keysToDelete)
    {
        ...some stuff not dealing with keysToDelete...
        _outConnections.Remove(key);
    }
    

    List<Guid> keysToDelete = _outConnections.Where(
        pair => pair.Value < timeoutPoint
    ).Select(pair => pair.Key).ToList();
    
    for (int i=keysToDelete.Count-1; i>=0; i--)
    {
        Guid key = keysToDelete[i];
        ...some stuff not dealing with keysToDelete...
        _outConnections.Remove(key);
    }
    

    为什么会这样?我有一种感觉,可能我的Linq查询并没有真正返回新集合,而是返回原始集合的某个子集,因此它指责我修改集合 keysToDelete 当我从中删除一个元素时 _outConnections .

    更新:

    List<Guid> keysToDelete = _outConnections.Where(
        pair => pair.Value < timeoutPoint
    ).Select(pair => pair.Key).ToList();
    
    foreach (Guid key in keysToDelete)
    {
        ...some stuff not dealing with keysToDelete...
        _outConnections.Remove(key);
    }
    
    1 回复  |  直到 15 年前
        1
  •  9
  •   Adam Robinson    15 年前

    你说得对。LINQ使用所谓的“延迟执行”。声明您的LINQ查询 实际上什么都没做

    但是, ToList() 应该创建一个与原始列表无关的全新列表。检查异常的调用堆栈以确保它实际上是由 keysToDelete .