Question

J'ai conçu une classe qui est fondamentalement rien mais un objet qui stocke un grand nombre de propriétés d'un morceau de données. Je l'ai mis en œuvre IComparable dans la classe. Les objets de la classe sont instanciés et stockés dans une liste.

Il y a un niveau de complexité en ce que certains champs de l'objet sur lequel je déterminer les champs de tri (il existe une hiérarchie) La hiérarchie est donc:

  • 1) Nom (défini à l'instanciation)
  • 2) Produit (défini à l'instanciation)
  • 3) NetGroup (défini post-instanciation, à la suite initiale création de la liste, j'itérer retour à travers, effectuer un calcul, et définir le groupe.)
  • 4) Date (défini à l'instanciation)

Il y a plusieurs drapeaux (champs booléens) qui déterminent si deux ci-dessus sont utilisés dans la hiérarchie de tri.

  • 5) AllowProductGroupingInd (défini à l'instanciation)
  • 6) AllowDateGroupingInd (défini à instanciation)

La performance du tri sur une liste relativement faible (n = 1000) est faible, généralement environ 500 ms.

Je ne suis pas sûr si je suis mon comparateur correctement mis en œuvre. Ma méthode ressemble à ceci:

    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;
                }

            }

J'utilise C # 3.0, donc je ne peux pas utiliser LINQ. Est-ce une mise en œuvre raisonnable de ce que je veux accomplir? Y at-il une solution plus élégante? Il me semble que je sois d'utiliser trop de conditionals, mais je ne suis pas sûr comment contourner cette difficulté.

Était-ce utile?

La solution

Vous semblez être le double d'appeler chacune des méthodes de CompareTo subsidiaire, le premier étant le plus probablement la principale performance sage coupable.

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

if (nameCompare != 0)
   return nameCompare;
else
   ...
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top