2

T.Add/Removeメソッドの List を広範囲に使用する 1 つのクラス ( MyClassと呼びましょう) で、非常に厄介なコードを見つけました。また、同じクラスがそのコレクションを T 型の IList を持つプロパティとして公開するため、型を変更するにはリファクタリングが必要になります。

また、その MyClass コレクションはイベント リスナー オブジェクトのコンテナーとして使用されるため、クライアント コードはサブスクライブ (コレクションに自身を追加) およびサブスクライブ解除 (コレクションから自身を削除) するだけです。リストの先頭/中間/末尾の順序は関係ありません。

パフォーマンスを向上させるために、内部の実装の詳細を置き換えたいと思います.List of Tを....と置き換えます。T の LinkedList を試しましたが、T の IList を実装していません。MSDN で T の IListを見ましたが、IListを実装するクラスのリストがないため、ドキュメントを比較できました。

もう 1 つのことは、T の IList を T の ICollection に変更しようとしたことです。これは解決策になる可能性があります ( MyClassのクライアント コードは Add/Remove メソッドを使用するため、リファクタリングは必要ありません) が、興味深いことが起こりました:

        LinkedList<string> list = new LinkedList<string>();
        list.Add("test");

エラーが発生すると、このコードはコンパイルされません。

'System.Collections.Generic.LinkedList' には 'Add' の定義が含まれておらず、拡張メソッド 'Add' もありません

しかし、私がそれを次のように変更したとき:

        ICollection<string> list = new LinkedList<string>();
        list.Add("test");

それから私は働きました。最初のサンプルがコンパイルされなかった理由と、項目の追加/削除に関して、.NET Framework での T の IList の最速の実装を教えてください。

ありがとう。

4

2 に答える 2

5

LinkedList<T>基本的に、明示的なインターフェイスの実装ICollection<T>使用して実装します。したがって、このメソッドは、「として」表示している場合にのみ使用できます。AddICollection<T>

ポイントは、リンクされたリストを使用していることがわかっている場合は、代わりにAddFirstorを使用する必要があるということです。AddLast

于 2012-08-09T18:45:48.450 に答える
1

追加と削除が最も高速な単一のクラスはありません。それらはすべて、特定の状況でより高速になるように構築されており、すべてに欠点もあります。 Listほとんどの場合、最後にすばやく追加できますが、すべての要素をコピーすることを伴う高価な追加が定期的に発生します。最初にアイテムを追加し始めると、ますます高価になります。撤去は最後は安上がりですが、始めに近づくにつれてどんどん高くなっていきます。

LinkedList最初または最後に効率的に追加できますが、これらの追加は a の最後に追加するよりもかなり遅くなりますList(ただし、非常に大きな追加はありません)。LinkedList高価なクイックの開始または終了以外の位置への追加。ほとんどの実際の状況でLinkedListは、パフォーマンスの観点からは適切なオプションではありません。

続けることもできますが、しばらく時間がかかります。よりパフォーマンスの高い代替手段 (または既存のコレクションを使用する別の方法) を提案するために、コレクションがどのように使用されているかについてより詳細を知る必要があるという点は変わりません。

あなたが持っているのは、順序付けする必要がなく、すべての最良のコレクションを効率的に追加/削除/反復する必要がある単なるデータのセットであると説明したのでHashSet<T>. ハッシュベースのデータ構造の内部の仕組みについて自分で調査することはできますが (かなりクールです)、要点は、それが非常に効率的な要素の追加/削除を行う順序付けられていないデータ構造であり、効率的に反復できることです。これはあなたの状況に最適です。ハッシュベースのデータ構造で覚えておくべきことの 1 つは、オブジェクトには意味のある実装が必要でGetHashCodeあるEqualsということです (デフォルトのものは、通常、カスタム型には使用されません)。intまたはのようなものを使用している場合stringキーとして、すでに適切な実装があります。

于 2012-08-09T18:56:15.933 に答える