Question

J'essaie d'implémenter une liste triée. J'ai créé la classe que je veux avoir stockée dans la liste, mais pour une raison quelconque, lorsque j'essaie d'exécuter la méthode de tri, j'obtiens une exception lancée. Il semble que quelque chose dans les coulisses passe dans un null référence dans le CompareTo Méthode que j'ai implémentée.

Voici ce que je pense être un code pertinent.

L'objet de données est défini comme ceci:

namespace PrioritisedRequestQueue
{
public class XactTask : IComparable<XactTask>
{
    public int priority;
    public DateTime submitted;
    public string name;

    public XactTask( int priority, DateTime submitted, string name)
    {
        this.priority = priority;
        this.submitted = submitted;
        this.name = name;
    }

    public int CompareTo(XactTask rhs )
    {
        //EXCEPTION OCCURS HERE AFTER A NULL RHS HAS BEEN PASSED IN**
        Console.WriteLine("comparing " + rhs.priority+"to "+this.priority); 

        if (rhs.priority <= this.priority)
        {
            Console.WriteLine("Entered first if");
            Console.WriteLine("comparing " + rhs.submitted + "to " + 
                this.submitted);
            if (rhs.submitted <= this.submitted)
            {
                Console.WriteLine("Entered second if");
                return 1;
            }
            else
            {
                return -1;
            }
        }
        else
        {
            Console.WriteLine("In else");
            return -1;
        }
    }
}
}

Et la classe pour conserver la liste est définie comme ceci:

namespace PrioritisedRequestQueue
{
    public class Class1
    {
        public List<XactTask> tasks;

        public Class1()
        {
            tasks = new List<XactTask>();
        }

        public void sort()
        {
            tasks.Sort();
        }

        public void add(XactTask task)
        {
            tasks.Add(task);

        }

    }
}

Voici le programme que j'utilise pour effectuer les tests:

PrioritisedRequestQueue.Class1 tester = new PrioritisedRequestQueue.Class1();

tester.add(new PrioritisedRequestQueue.XactTask(1, DateTime.Now, "test1"));
tester.add(new PrioritisedRequestQueue.XactTask(1, DateTime.Now, "test2"));
Console.WriteLine(tester.tasks[0].name);
Console.WriteLine(tester.tasks[1].name);
tester.tasks.Sort();

La sortie du programme de test est:

 comparing 1to 1 Entered first if
 comparing 16/05/2011 14:41:57to 16/05/2011 14:41:57 
 Entered second if
 comparing 1to 1 Entered first if
 comparing 16/05/2011 14:41:57to 16/05/2011 14:41:57 
 Entered second if
 comparing 1to 1 
 Entered first if
 comparing 16/05/2011 14:41:57to 16/05/2011 14:41:57 
 Entered second if
 comparing 1to 1 
 Entered first if
 comparing 16/05/2011 14:41:57to 16/05/2011 14:41:57 
 Entered second if

Ensuite, il semble passer un null objet RHS dans la méthode Compare et j'obtiens un NullReferenceException Quand il essaie d'accéder à la priorité de RHS.

Pouvez-vous me dire pourquoi cela se produit et ce que je dois faire pour y remédier?

Veuillez me faire savoir si vous avez besoin de plus d'informations.

Était-ce utile?

La solution

Quand j'exécute votre code, j'obtiens un InvalidOperationException car CompareTo n'est pas implémenté correctement.

Ton CompareTo la mise en oeuvre devoir revenir 0 si rhs est le même que this (c'est-à-dire que cet objet et l'objet comparé sont égaux). Il ne devrait pas échouer également si rhs == null, mais devrait commander null d'une manière cohérente; Cela se fait généralement en revenant toujours 1 Trier null avant tous les objets valides.

La Documentation pour icomparable.compareto Répertorie les règles suivantes, qui doivent être suivies pour que le tri fonctionne correctement:

  • A.CompareTo(A) est nécessaire pour retourner zéro.

  • Si A.CompareTo(B) Renvoie zéro, alorsB.CompareTo(A) est nécessaire pour retourner zéro.

  • Si A.CompareTo(B) Renvoie zéro etB.CompareTo(C) Renvoie zéro, alorsA.CompareTo(C) est nécessaire pour retourner zéro.

  • Si A.CompareTo(B) Renvoie une valeur autre que zéro, puis B.CompareTo(A)est nécessaire pour renvoyer une valeur du signe opposé.

  • Si A.CompareTo(B) Renvoie une valeur x qui n'est pas égale à zéro, etB.CompareTo(C) Renvoie une valeur y du même signe que x, puisA.CompareTo(C) est nécessaire pour renvoyer une valeur du même signe que x et y.

Pour résoudre le problème, assurez-vous que votre implémentation de CompareTo Renvoie 0 quand priority == rhs.priority && submitted == rhs.submitted.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top