我在WinForms中并且在保存对DataBase的更改之前,我必须检查使用的ErrorProvider是否为任何显示的控件保留错误。
我想出了几种方法:
ControlContainer上的一个简单的foreach循环:
foreach (Control c in ctrlcontainer)
{
if (epOrderHeader.GetError(c) != string.Empty)
{
return true;
}
}
return false;
使用List扩展方法Exists(Predicate):
return(ctrlcontainer.Exists(c => epOrderHeader.GetError(c)!= string.Empty);
从胃口开始,我预计第二个是最快的,但是使用我发现的Eqatec Profiler,foreach循环稍微快一些(在我的情况下大约1ms)。虽然这是微不足道的,但我仍然想知道为什么会这样?
编译器如何翻译这些方法,为什么第一个方法更快?
答案 0 :(得分:1)
为什么期望List.Exists方法更快? 本质上它与您的手动检查相同,但它确实做了额外的一件事,是使用谓词而不是直接检查进行检查。这必须花费一点性能。
答案 1 :(得分:0)
如果您在SetError
内的控件中使用功能ctrlcontainer
,则可以跟踪错误发生的时间。我建议使用您的自定义类扩展类ErrorProvider
或在您的某个类中包含该提供程序,以便您可以覆盖SetError
方法,即您不需要检查任何内容,因此可以比较Exists
和foreach
无关。