2009-10-23 3 views
2

Je veux quelque chose comme une liste < chaîne >, mais chaque fois que je fais un « Ajouter », il conserve la liste triée. Des idées?comme une liste <string> mais conserve les chaînes commandées?

+0

Je veux qu'il commence vide et rester triée chaque fois que j'Ajouter. – JoelFan

+0

Juste pour clarifier: est-ce que vous mettez seulement des choses dans la liste qui peuvent être automatiquement triées, ou devez-vous être capable de transmettre quelque chose qui définit comment trier? –

+0

cordes, donc rien ne doit être passé dans – JoelFan

Répondre

11

Vous pouvez essayer un SortedList ou un SortedDictionary. Les deux feront ce que vous devez faire, mais avec des implémentations légèrement différentes. Vous pouvez trouver les différences mises en évidence here.

+9

Notez que ne sont pas accessibles SortedList et SortedDictionary par index et ne mettent pas en œuvre l'interface IList . Les deux sont plus comme des dictionnaires que des listes. Plus précisément, vous ne pouvez pas faire SortedList .Add (someString) - vous devez transmettre une clé et une valeur. Ceci est très peu naturel pour une interface semblable à une liste. – itowlson

2

Utiliser la liste < T> et appelez List< T >.Sort.

List<string> dinosaurs = new List<string>(); 

dinosaurs.Add("Pachycephalosaurus"); 
dinosaurs.Add("Amargasaurus"); 
dinosaurs.Add("Mamenchisaurus"); 
dinosaurs.Add("Deinonychus");  

Console.WriteLine("\nSort"); 
dinosaurs.Sort(); 

EDIT: Vous pouvez également étendre Liste < T>, override Ajouter, choisir un.

ExtendedList:

public class ExtendedList<T> : List<T> 
{ 
    public new void Add(T t) 
    { 
     base.Add(t); 
     base.Sort(); 
    } 
} 

ExtendedList avec BinarySearch:

public class ExtendedList<T> : List<T> 
{ 
    public new void Add(T t) 
    { 
     int index = base.BinarySearch(t); 
     if (index < 0) 
     { 
      base.Insert(~index, t); 
     } 

    } 
} 
+0

J'ai pensé à cela, mais je ne veux pas le tri à chaque fois que j'accède à la liste – JoelFan

+3

Vous comprenez que tout ce que vous utilisez pour trier automatiquement aura des frais généraux droit? –

1

Vous pouvez créer votre propre classe, MySortList, qui implémente IList, et votre propre interface IMySort

Qui aurait une méthode supplémentaire de AddAndSort (T t)

ce ne serait pas avec interchangable IList normale cependant, mais il ne fait ce que vous devez.

+0

Cela fonctionnerait réellement si votre implémentation de 'Add' appelait' AddAndSort'. Et parce que vous implémentez IList, il serait _ interchangeable avec IList ... c'est le point de séparer l'interface de l'implémentation. Cependant, vous n'auriez pas besoin d'IMySort. –

+0

Oui mais IList n'implémente pas AddAndSort, d'où l'interface supplémentaire. Sauf si vous avez ignoré AddAndSort, et à chaque ajout, le trier. Ensuite, il serait interchangeable avec IList – PostMan

1

Vous pouvez étendre List de sorte que la méthode Add effectue une recherche binaire pour trouver l'emplacement d'insertion correct, puis l'ajouter à cet emplacement. Cela devrait donner de meilleures performances que de surcharger Add pour ajouter puis trier la liste. (BTW, Sort utilise Quicksort, qui ne donne pas nécessairement une grande performance pour ce cas.)

Questions connexes