Resharper 的 'Possible Multiple enumeration of IEnumerable warning'
Resharper's 'Possible Multiple enumeration of IEnumerable warning'
不重复:我不觉得这是重复的,因为在我的具体情况下,我觉得忽略警告实际上更好。
例如,
IEnumerable<Item> milionItems = GetAMillionItemsFromDatabase();
var item1 = millionItems.FirstOrDefault(x=> x.Condition == "Excellent");
var item2 = millionItems.FirstOrDefault(x=> x.Condition == "Good");
我在 'millionItems' 下收到了警告消息,我知道它是什么意思,但是我不确定它是否总是值得 ToList'ing 只是为了摆脱它。
GetAMillionItemsFromDatabase().ToList();
这看起来很糟糕,因为它会一次将一百万条记录带入内存。
但是,如果我不这样做并继续枚举 IEnumerable,即使它会访问数据库两次,它也不会将所有数据都带入,因为它会找到第一个匹配项并且 return.在这种情况下,在我看来最好忽略该消息。
在这种情况下,两次访问数据库很有可能比通过 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;
}
}
这有很好的机会在客户端遍历很多项目,但至少不会同时将它们保留在内存中。
如果这些只是您需要构建的 2 个查询,则使用 ToList
转换为列表可能不会更好。
不重复:我不觉得这是重复的,因为在我的具体情况下,我觉得忽略警告实际上更好。
例如,
IEnumerable<Item> milionItems = GetAMillionItemsFromDatabase();
var item1 = millionItems.FirstOrDefault(x=> x.Condition == "Excellent");
var item2 = millionItems.FirstOrDefault(x=> x.Condition == "Good");
我在 'millionItems' 下收到了警告消息,我知道它是什么意思,但是我不确定它是否总是值得 ToList'ing 只是为了摆脱它。
GetAMillionItemsFromDatabase().ToList();
这看起来很糟糕,因为它会一次将一百万条记录带入内存。
但是,如果我不这样做并继续枚举 IEnumerable,即使它会访问数据库两次,它也不会将所有数据都带入,因为它会找到第一个匹配项并且 return.在这种情况下,在我看来最好忽略该消息。
在这种情况下,两次访问数据库很有可能比通过 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;
}
}
这有很好的机会在客户端遍历很多项目,但至少不会同时将它们保留在内存中。
如果这些只是您需要构建的 2 个查询,则使用 ToList
转换为列表可能不会更好。