2

私たちのプロジェクトは現在、ページ内のコントロールを見つけるために 2 つの方法を使用しています。1 つ目は、 .FindControl を再帰的に使用することです。 もう 1 つは、次のように 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;
        }
    }
}

これらの2つの方法のうち、どちらが優れていますか? どちらが速いですか?

4

3 に答える 3

3

テストを実行して調べることはできますが、ストップウォッチ クラスはすばやく簡単に使用でき、約 30 秒の作業で知っておくべきことを正確に教えてくれます。見つけたものをお知らせください。

http://www.dotnetperls.com/stopwatch

http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx

デバッグのみを行うため、各ストップウォッチの最後にブレークポイントを追加するか、Response.Write を使用して値を出力することをお勧めします。

編集: 実際にパフォーマンスの問題に気付いたことがありますか、それとも標準化して正しい方法を選択するようにしようとしていますか?

コントロールの数に応じて.Net 4を使用している場合は、並列拡張機能を使用してリストをより迅速に反復処理することを検討できます。「AsParallel()」を検索

于 2011-04-04T16:42:49.863 に答える
1

これは直感的な答えですが、手書きのコードが生成する IL コードは、おそらく FindControl で使用されるコードと非常によく似ていると思います。ただし、大きな違いの 1 つは、Microsoft コードは一般に CLR 用に非常に最適化されており、多くのコンパイラ ヒントを利用してほとんどの手書きコードよりも高速に実行されることです。

したがって、私は個人的に再帰呼び出しで FindControl を使用します。

于 2011-04-04T16:43:31.007 に答える
1

あなたのコードとFindControlは機能的に異なります。彼らは同じことをしません。

FindControlあなたのコードはディープサーチを実行しますが、ディープサーチは実行しません。MSDNから:

このメソッドは、コントロールが指定されたコンテナに直接含まれている場合にのみコントロールを検索します。つまり、このメソッドは、コントロール内のコントロールの階層全体を検索しません。

どちらが良いですか?場合によります。ページ上のコントロールの場所がわからない場合は、再帰メソッドで見つけることができます。

ただし、Panel (ID="MyPanel") にカスタム UserControl (ID="MyControl") と Label (ID="MyName") の 2 つのコントロールがあるとします。`MyPanel.FindControl("MyName") を呼び出すと、パネルに期待されるラベルが返されます。関数を使用すると、最初に MyControl 内で ID="MyName" のラベルが検索されます。そのため、MyControl に ID="MyName" のラベルも含まれている場合は、代わりにそれが返されます。探しているものと同じ ID を持つ子コントロールがコントロールによって生成された場合、これは予想外の可能性があります。

パフォーマンスに関しては、メソッドはより深い検索を実行するため、はるかに高価な操作になる可能性があります。

于 2011-04-04T16:40:51.463 に答える