Resharper的'可能多次枚举IEnumerable警告'

Use*_*123 3 c# resharper optimization ienumerable

不重复:我觉得这不是重复,因为在我的具体情况下,我觉得忽略警告实际上更好.

例如,

IEnumerable<Item> milionItems = GetAMillionItemsFromDatabase();

var item1 = millionItems.FirstOrDefault(x=> x.Condition == "Excellent");

var item2 = millionItems.FirstOrDefault(x=> x.Condition == "Good");
Run Code Online (Sandbox Code Playgroud)

我收到'millionItems'下的警告信息,我知道这意味着什么,但我不确定是否总是值得ToList'去摆脱它.

GetAMillionItemsFromDatabase().ToList();
Run Code Online (Sandbox Code Playgroud)

这看起来很糟糕,因为它会立刻将一百万条记录带入内存.

但是,如果我不这样做并继续枚举IEnumerable,即使它会两次打到数据库,它也不会带来所有数据,因为它会找到第一个匹配项并返回.在这种情况下,在我看来,实际上忽略该消息更好.

Ale*_*kov 5

在这种情况下,两次进入DB的可能性要大于IEnumerable在当前代码中执行的客户端搜索.

如果你不能将搜索推送到数据库(即通过保持IQueryable<Item>允许链接),你仍然可以通过检查每个项目的两个条件来稍微优化查找:

  foreach(var x in millionItems)
  {
     item1 = item1 == null && x=> x.Condition == "Excellent" ? x : item1;
     item2 = item2 == null && x=> x.Condition == "Good" ? x : item2;

     if (item1 != null && item2 != null)
     {
           break;
     }
  }
Run Code Online (Sandbox Code Playgroud)

这有很好的机会通过客户端的很多项目,但至少它不会同时保留在内存中.

ToList如果只需要构建2个查询,则转换为列表不太可能更好.