Foreach循环正确-使用.Any()检查返回错误

Yur*_*oor 1 c# linq

我有一个列表Guid,其中保留Guid了我的项目列表中的所有重复项:

IEnumerable<Guid> duplicateExists = ListOfMyItems
  .GroupBy(x => x.ID)
  .Where(group => group.Count() > 1)
  .Select(group => group.Key);
Run Code Online (Sandbox Code Playgroud)

现在,我要检查是否存在重复,如果存在,请从中删除它的最后一次出现ListOfMyItemsDeleteItemFromOrder只是从数据库中删除一行。

这有效:

 foreach (var item in duplicateExists)
 {                        
     _ = ListOfMyItems.Remove(ListOfMyItems.Last(x => x.ID == item));
     MyLogic.DeleteItemFromOrder(Bill.ID, item);                      
     return;
 }
Run Code Online (Sandbox Code Playgroud)

虽然这将输入条件if,然后失败DeleteItemFromOrder,但告诉我duplicateExists - sequence contains no elements

 if(duplicateExists.Any())
 {                        
     _ = ListOfMyItems.Remove(ListOfMyItems.Last(x => x.ID == duplicateExists.First()));
     MyLogic.DeleteItemFromOrder(Bill.ID, duplicateExists.First());                      
     return;
 } 
Run Code Online (Sandbox Code Playgroud)

为什么第二个示例失败?

Dmi*_*nko 7

这是Linq 延迟执行的结果:

 IEnumerable<Guid> duplicateExists = ListOfMyItems
   .GroupBy(x => x.ID)
   .Where(group => group.Count() > 1)
   .Select(group => group.Key);
Run Code Online (Sandbox Code Playgroud)

系统实际上不执行查询;那你有

if (duplicateExists.Any())
{                        
    _ = ListOfMyItems.Remove(ListOfMyItems.Last(x => x.ID == duplicateExists.First()));
    MyLogic.DeleteItemFromOrder(Bill.ID, duplicateExists.First());                      
    return;
} 
Run Code Online (Sandbox Code Playgroud)

系统执行以下操作:

  1. 执行duplicateExists.Any()并获取true,因为存在重复项
  2. 执行duplicateExists.First()获取重复项并将其从-中删除ListOfMyItemsListOfMyItems.Remove
  3. 尝试duplicateExists.First()再次执行MyLogic.DeleteItemFromOrder,现在由于已被修改没有重复项失败 - 为ListOfMyItemsduplicateExists

快速补丁: 兑现duplicateExists迫使该系统执行集合中的查询和存储结果,例如数组:

  IEnumerable<Guid> duplicateExists = ListOfMyItems
   .GroupBy(x => x.ID)
   .Where(group => group.Count() > 1)
   .Select(group => group.Key)
   .ToArray();
Run Code Online (Sandbox Code Playgroud)