0

基本的に、データの多数のプロパティを格納するオブジェクトにすぎないクラスを設計しました。クラスに IComparable を実装しました。クラスのオブジェクトはインスタンス化され、List に格納されます。

オブジェクトの特定のフィールドがどのフィールドでソートするかを決定するという複雑さのレベルが追加されています (階層があります)。階層は次のようになります。

  • 1) 名前 (インスタンス化時に定義)
  • 2) 製品 (インスタンス化時に定義)
  • 3) NetGroup (インスタンス化後に定義。リストを最初に作成した後、反復処理を繰り返し、計算を実行し、グループを設定します。)
  • 4) 日付 (インスタンス化時に定義)

上記の 2 つがソート階層で使用されているかどうかを決定するフラグ (bool フィールド) がいくつかあります。

  • 5) AllowProductGroupingInd (インスタンス化時に定義)
  • 6) AllowDateGroupingInd (インスタンス化時に定義)

比較的小さなリスト (n = 1000) での並べ替えのパフォーマンスは低く、一般に約 500 ミリ秒です。

比較子を適切に実装したかどうかはわかりません。私の方法は次のようになります。

    public int CompareTo(Exposure rfpe)
            {
                if (Name.CompareTo(rfpe.Name) != 0)
                    return Name.CompareTo(rfpe.Name);
                else
                {
                    if (AllowProductGroupingInd == false)
                    {
                        if (ProductId.CompareTo(rfpe.ProductId) != 0)
                            return ProductId.CompareTo(rfpe.ProductId);
                    }

                    if (NetGroup.CompareTo(rfpe.NetGroup) != 0)
                        return NetGroup.CompareTo(rfpe.NetGroup );
                    else if (AllowDateGroupingInd == false)
                    {
                        if (Date.CompareTo(rfpe.Date) != 0)
                            return Date.CompareTo(rfpe.Date);
                        else
                            return 0;
                    }

                    return 0;
                }

            }

C# 3.0 を使用しているため、LINQ を使用できません。これは私が達成したいことの合理的な実装ですか? よりエレガントなソリューションはありますか?あまりにも多くの条件を使用しているように思えますが、それを回避する方法がわかりません。

4

1 に答える 1

0

それぞれの補助メソッドを二重に呼び出しているように見えますCompareTo。最初のメソッドがパフォーマンスの主な原因である可能性が最も高いです。

int nameCompare = Name.CompareTo(rfpe.Name);

if (nameCompare != 0)
   return nameCompare;
else
   ...
于 2010-08-19T05:16:32.503 に答える