2

の間にパフォーマンスの違いはありますか

List<T>.Sort Method (Comparison<T>)

List<T>.Sort Method (IComparer<T>)?

構造的な (ソフトウェア アーキテクチャ上の) メリットはありますか?

比較クラスの代わりに比較メソッドを使用するのはいつですか、またはその逆ですか?

編集:

List<T>.Sort Method (IComparer<T>)方が速いです。ありがとうジム・ミシェル!

パフォーマンスの違いは、私の PC では約 1% です。

比較クラスの方が速いようです。

4

2 に答える 2

3

違いは、1 つ目はメソッド (匿名または非匿名) を受け入れ、2 つ目は比較オブジェクトのインスタンスを受け入れることです。単一の関数内にすべてを記述するよりも、複雑でカスタマイズ可能な比較クラスを定義する方が簡単な場合があります。

1 次元での単純な並べ替えには前者を、データ グリッドなどの多次元並べ替えには後者を好みます。

比較子を使用すると、キャッシュに役立つことが多いプライベート メンバーを持つことができます。これは、特定のシナリオ (グリッドに表示される大規模なデータ セットの複雑な並べ替え) で役立ちます。

于 2013-03-20T13:35:05.647 に答える
2

私が思い出したように、 をList.Sort(Comparer<T>)インスタンス化してIComparer<T>から を呼び出しますList.Sort(IComparer<T>)

次のようになります。

class SortComparer<T>: IComparer<T>
{
    private readonly Comparison<T> _compare;
    public SortComparer(Comparison<T> comp)
    {
        _compare = comp;
    }

    public int Compare(T x, T y)
    {
        return _compare(x, y);
    }
}

public Sort(Comparison<T> comp)
{
    Sort(new SortComparer(comp));
}

だから彼らは本当に同じことをすることになります。(.NET 3.5 に戻って) このような時間を計ったときSort(IComparer<T>)、すべての呼び出しで追加の逆参照を行う必要がなかったため、わずかに高速でした。しかし、その差は心配するほど大きくはありませんでした。これは間違いなく、最も速く実行されるものではなく、コードで最もうまく機能するものを使用するケースです。

IComparerデフォルトの実装に関する情報を含む、それについてのもう少し: Of Comparison と IComparer

于 2013-03-20T13:48:06.953 に答える