作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在使用新的 Resharper 版本 6。在我的代码中的几个地方,它对一些文本加了下划线,并警告我可能存在 可能的 IEnumerable 多重枚举。
我理解这意味着什么,并在适当的时候采纳了建议,但在某些情况下,我不确定这是否真的很重要。
如以下代码:
var properties = Context.ObjectStateManager.GetObjectStateEntry(this).GetModifiedProperties();
if (properties.Contains("Property1") || properties.Contains("Property2") || properties.Contains("Property3")) {
...
}
它在每次提到 properties
时都会下划线在第二行,警告我正在多次枚举此 IEnumerable。
如果我添加 .ToList()
到第 1 行的末尾(将 properties
从 IEnumerable<string>
变为 List<string>
),警告消失。
但是可以肯定的是,如果我将它转换为一个列表,那么它首先会枚举整个 IEnumerable 以构建列表,然后根据需要枚举列表以查找属性(即 1 个完整枚举,以及3 部分枚举)。而在我的原始代码中,它仅执行 3 个部分枚举。
我错了吗?这里最好的方法是什么?
最佳答案
我不知道您的 properties
到底是什么 - 但如果它本质上代表一个未具体化的数据库查询,那么您的 if
语句将执行三个查询。
我怀疑这样做会更好:
string[] propertiesToFind = { "Property1", "Property2", "Property3" };
if (properties.Any(x => propertiesToFind.Contains(x))
{
...
}
这将逻辑上只迭代序列一次 - 如果涉及数据库查询,它很可能只使用 SQL“IN”子句在数据库中完成所有操作单个查询。
关于c# - Resharper:IEnumerable 的可能多重枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6593825/
我是一名优秀的程序员,十分优秀!