C# 在ASP.Net中哪个更快?

C# 在ASP.Net中哪个更快?,c#,asp.net,findcontrol,C#,Asp.net,Findcontrol,我们的项目目前正在使用两种方法来查找页面内部的控件。 第一种方法是递归使用.FindControl。 另一个是像这样使用LINQ: (from n in Page.Controls.Cast<Control>().Descendants(c => c.Controls.Cast<Control>()) where (n as Label != null && n.ID == "TaskIDLabel") select n).First() as

我们的项目目前正在使用两种方法来查找页面内部的控件。 第一种方法是递归使用.FindControl。 另一个是像这样使用LINQ:

(from n in Page.Controls.Cast<Control>().Descendants(c => c.Controls.Cast<Control>())
 where (n as Label != null && n.ID == "TaskIDLabel")
 select n).First() as Label;
使用此扩展的:

static public IEnumerable<T> Descendants<T>(this IEnumerable<T> source,
                                            Func<T, IEnumerable<T>> DescendBy)
{
    foreach (T value in source)
    {
        yield return value;

        foreach (T child in DescendBy(value).Descendants<T>(DescendBy))
        {
            yield return child;
        }
    }
}
这两种方法中哪一种更好?哪个更快?

您的代码和FindControl在功能上是不同的。他们不会做同样的事情

FindControl不执行深度搜索,而您的代码执行深度搜索。发件人:

仅当控件直接包含在指定容器中时,此方法才会找到该控件;也就是说,该方法不会在控件中的整个控件层次结构中进行搜索

哪个更好?视情况而定。如果您不知道控件在页面上的位置,那么递归方法可以找到它

但是,假设面板ID=MyPanel中有两个控件:自定义UserControl ID=MyControl和标签ID=MyName。如果调用'MyPanel.FindControlMyName',将返回面板中的预期标签。如果使用函数,它将首先在MyControl中搜索ID=MyName的标签。因此,如果MyControl碰巧还包含ID=MyName的标签,则将返回该标签。如果一个控件碰巧生成了一个子控件,并且该子控件的ID与您要查找的控件的ID相同,则这可能是意外的


至于性能,您的方法执行更深入的搜索,因此它可能是一个更昂贵的操作。

我可以执行测试并找出原因,但是stopwatch类快速且易于使用,并且将在大约30秒的时间内准确地告诉您需要知道的内容。让我们知道你发现了什么

我建议在每个秒表的末尾添加断点,或者只使用Response.Write输出值,因为您只是在调试

编辑: 您是否注意到任何性能问题,或者您是否正在尝试标准化并确保选择正确的方法


如果您使用的是.NET4,根据控件的数量,您可以考虑使用并行扩展更快地遍历列表,这可能会有所帮助。查找AsParallel

这是一个简单的答案,但我要说的是,您手工编写的代码将生成的IL代码可能与FindControl使用的代码非常相似。然而,一个主要区别是Microsoft代码通常针对CLR进行了极大的优化,利用了大量编译器提示以比大多数手写代码更快的速度执行


因此,我个人会在递归调用中使用FindControl。

两者都不是更好的,因为一个是在另一个之上构建的。@Justin-我认为与问题中发布的代码相比,OP询问的是FindControl。@Greg-第四次或第五次阅读后,我认为您可能是对的。不过措辞有点混乱。@Justin-希望@James能够编辑以澄清这个问题,假设FindControl是递归使用的,即检查Control.HasChildren是否对这些子控件及其控件调用FindControl,等等。Op说他递归使用FindControl,而不是说它本身是递归的。