25

すべてのアイテムを整理しておくコンテナを探しています。SortedListを見ましたが、別のキーが必要であり、重複キーは許可されていません。ソートされていないコンテナを使用して、挿入するたびに明示的にソートすることもできます。

使用法:

  • 時折挿入
  • 順番に頻繁にトラバーサル
  • 理想的には、実際のオブジェクトとは別のキーを使用せず、比較機能を使用して並べ替えます。
  • 同等のオブジェクトの安定したソートが望まれますが、必須ではありません。
  • ランダムアクセスは必要ありません。

バランスの取れたツリー構造を自分で構築できることに気づきました。フレームワークにすでにそのような獣が含まれているのではないかと思っていました。

4

7 に答える 7

20

WintellectPowerCollectionsをご覧になることをお勧めします。これはCodePlexで利用可能であり、非常に役立つコレクションがかなり含まれています。プロジェクトのOrderedBagコレクションは、まさにあなたが探しているものです。それは本質的に赤黒木を使用してかなり効率的なソートを提供します。

于 2008-10-13T02:25:29.250 に答える
13

EBarrのコメントを答えにするために、.NET 4.0以降がありますSortedSet<T>。もちろんセットですので、重複はできません。

于 2014-02-07T09:20:43.660 に答える
4

標準コレクションに固執したいだけの場合Sort(IComparer<>)、クラスの機能はList<>しばしば無視されます。Comparer<>オブジェクトに適した を作成するだけです。例えば:

public class PositionDateComparer : IComparer<VehiclePosition>
{
    public int Compare(VehiclePosition x, VehiclePosition y)
    {
        if (x.DateTime == DateTime.MinValue)
        {
            if (y.DateTime == DateTime.MinValue)
            {
                // If x is null and y is null, they're
                // equal. 
                return 0;
            }

            // If x is null and y is not null, y
            // is greater. 
            return -1;
        }

        // If x is not null...
        //
        if (y.DateTime == DateTime.MinValue)
        // ...and y is null, x is greater.
        {
            return 1;
        }

        // ...and y is not null, compare the dates
        //
        if (x.DateTime == y.DateTime)
        {
            // x and y are equal
            return 0;
        }

        if (x.DateTime > y.DateTime)
        {
            // x is greater
            return 1;
        }

        // y is greater
        return -1;
    }
}

次にvehiclePositionsList.Sort(new PositionDateComparer())、リストにアクセスする前にリストを並べ替えたいときはいつでも a を実行します。これは、新しいオブジェクトを追加するたびに自動的にソートされるコンテナーほど単純ではないかもしれませんが、多くの場合 (私のように!)、追加のライブラリーを必要とせずにジョブを正常に実行するには、これで十分かもしれません。

于 2009-09-24T08:47:58.783 に答える
3

あなたが言ったように、私はあなた自身のリストクラスを拡張します。それはあなたが言ったように、すべての挿入の後に単にソートします。挿入の頻度が低いため、パフォーマンスへの影響は最小限に抑えられ、どのような場合でも、ほぼ並べ替えられたリストの並べ替えは迅速に行われます。汎用リストを拡張し、Addメソッドをオーバーライドしてすぐに並べ替えます。パフォーマンスが問題になる場合は、時間を節約するために所定の位置に挿入できます。さらに、挿入をキューに入れて、挿入するすべての値に対して単一のトラバーサル挿入を実行できます。

于 2008-10-13T02:35:34.220 に答える
2

先にここで述べたように、C5 Generic Collection Libraryには適切なコンテナがあります。

于 2008-10-13T19:15:22.270 に答える
-1

キーがオブジェクトの属性でもある場合は、System.Collections.ObjectModel.KeyedCollection<TKey, TItem>. これは抽象クラスですが、キーがアイテムの単なるプロパティである場合、派生するのは非常に簡単です。

于 2008-10-13T02:18:37.360 に答える
-15

これは、私が VB6 でアルファベット順に並べ替えるために使用した古いトリックです。 System.Windows.Forms ListBox オブジェクトを使用し、その "Sorted" プロパティを true に設定します。C# では、任意のオブジェクトをリスト ボックスに挿入でき、オブジェクトは ToString() 値によってアルファベット順に並べ替えられます。

クラス モジュールの場合:


System.Windows.Forms を使用します。

    static void Main(string[] args)
    {
        ListBox sortedList = new ListBox();
        sortedList.Sorted = true;

        sortedList.Items.Add("foo");
        sortedList.Items.Add("bar");
        sortedList.Items.Add(true);
        sortedList.Items.Add(432); 

        foreach (object o in sortedList.Items)
        {
            Console.WriteLine(o);
        }

        Console.ReadKey();
    }

次のように表示されます。

432
バーフー 真
_

于 2008-10-13T03:08:58.913 に答える