[英]C# loop optimization
我有这个循环,它至少循环大数,如30 000次
我正在寻找一些方法来改善它的性能
DbRecordDictionary派生自DictionaryBase类
这是循环:
ArrayList noEnter = new ArrayList();
DbRecordDictionary oldArray = new DbRecordDictionary();
DbRecordDictionary userArray = new DbRecordDictionary();
DbRecordDictionary result = null;
foreach (string key in keys)
{
if (noEnter.Contains(key))
{ //may need cast!
if (count < 1)
result.Add(key, userArray[key]);
else if (oldArray.Count == 0)
break;
else if (oldArray.Contains(key))
result.Add(key, userArray[key]);
}
}
您可能需要使用词典/对于的Hashset oldArray
,但其他人没有什么可以做。 如果是数组,也noEnter
。
从我所看到的,变量count
或oldArray
在循环期间永远不会改变,因此你可以将这些条件放在循环之外,并制作两个不同的循环。
if (count < 1) {
foreach (string key in keys) {
if (noEnter.Contains(key)) {
result.Add(key, userArray[key]);
}
}
} else if (oldArray.Count == 0) {
// no data
} else {
foreach (string key in keys) {
if (noEnter.Contains(key)) {
if (oldArray.Contains(key)) {
result.Add(key, userArray[key]);
}
}
}
}
集合noEnter
和oldArray
应该是字典,否则你将在Contains
调用中花费大量的执行时间。
如果noEnter中有超过10个项目,则使用Dictionary而不是List / Array。 当List / Array必须循环遍历所有项目时,Dictionary可以查找项目而无需查看所有项目。
否则考虑缩短“keys”和“oldArray”,然后在它们上形成“合并”。 查看“合并排序”的代码,了解如何进行合并。 (这需要仔细分析)
尝试这个
(from k in keys
where noEnter.Contains(k) &&
oldArray.Count > 0 &&
count < 1 &&
oldArray.Contains(k)
select k)
.ToList()
.ForEach(k => result.Add(k, userArray[k]));
小的小优化可能是使用泛型ArrayList noEnter = new ArrayList(); 将是List noEnter = new List(); 和DbRecordDictionary将继承Dictonary而不是DictionaryBase。
我不是100%肯定你会获得性能,但你会使用更现代的c#风格。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.