0
votes

Comment obtenir une liste d'objets commandés par numéro de titre?

J'ai un dictionnaire des objets "Titre" dans mon code C #: Dictionnaire Dalltitales >

avec la classe de titre Définissez comme suit: p>

    class Title
    {
        public long TitleID { get; set;}
        public string TitleText { get; set;}
        public string TitleNumber { get; set;}
    }


16 commentaires

Ordonné comment ? Comment ces deux-là doivent-ils être commandés: 2.10 vs 2.9 ?


À propos, les dictionnaires n'ont pas de commande, vous devrez les mettre dans l'une des collections séquentielles ou commandées.


Vous devrez écrire un comparateur. Pas du tout du tout. MSDN < / a>


Il faut commander comme celui-ci: 2.9, 2.10, 2.11 etc ..


Ensuite, vous aurez besoin d'une implémentation de «tri naturel». Pas sûr qu'il y en a une intégré à .NET, mais voyons d'abord si cela a déjà été répondu ici.


Il y en a un dans Windows, disponible via p / invoke: Stackoverflow.com/questions/248603/... , vous pouvez l'utiliser pour comparer deux éléments d'une telle collection.


@ Lassevågsætherkarlsen je le contrôle, merci


Vous avez défini Titlenumber en tant que type long, mais mentionné une valeur possible étant: 4.6.5.2.5. Ce n'est certainement pas une longue. Est-ce une corde ou est-ce une longue?


@ Lassevågsætherkarlsen Merci, déjà corrigé cela juste après que je l'ai tapé. Je préférerais que l'op me dise quelles sont ses exigences. Semble un peu plus approprié. :)


@coderpros titlenumber est une chaîne? Peut-être qu'il y avait une version très précoce de la question éditée à l'intérieur de la période de grâce.


Titlenumber est une chaîne comme indiqué dans la classe de titres.


@Nicolasdaumalle Je suis attardé ... regardait Tittidid. C'est ce que je reçois de la réveil et de la regarder immédiatement. Oops


@coderpros: D Pas de problèmes!


@Taw je vais essayer ça, merci.


@Nicolasdaumalle Quel est l'ordre lorsque Concernant 3.1, 3.1.1, 3.11, 3.10?


@Anuviswan Il convient de commander comme ce que vous avez écrit.


3 Réponses :


-1
votes

Je ne suis pas sûr de comprendre quelles règles vous souhaitez appliquer à votre logique de commande, mais pour moi, Linq peut faire ce que vous voulez.

dico.OrderBy(kvp => kvp.Value.TitleNumber).ToDictionary(kvp => kvp.Key);


4 commentaires

Cela ne fonctionnera pas avec 3.1, 3.10, 3.1.1


@Nicolasdaumalle Quel est l'ordre lorsque Concernant 3.1, 3.1.1, 3.11, 3.10?


Je l'ai testé avec le Dictionnaire de Dico suivant = nouveau dictionnaire () {{1, nouveau titre {titleid = 10, titleext = "text10", titlenumber = "1.1"}}, {2, nouveau titre { TitleID = 20, titleext = "text20", titlenumber = "1.2"}}, {3, nouveau titre {titleid = 30, titleext = "text30", titlenumber = "2.1"}}, {4, nouveau titre {Titleid = 40, titleext = "text40", titlenumber = "1.3"}}, {5, nouveau titre {titleid = 50, titleext = "text50", titlenumber = "0.5"}}}; et il génère des objets dans l'ordre suivant: 5, 1, 2, 4, 3 qui a l'air correct pour moi


Il fonctionne avec des valeurs telles que "1.2.1" aussi



0
votes

Vous pouvez utiliser une fonction d'assistant cheapo: xxx pré>

puis trier avec linq: p> xxx pré>

Certains artistes de Linq peuvent même le rouler Tout en un, mais pas moi; -) p>

Notez que j'ai omis tous les chèques! Vous pouvez également ignorer une ligne dans la fonction et renvoyer direcly et choisir un nombre maximum de digitts dans le format de chaîne .. p>

entrée (classe légèrement modifiée): p>

1.1
1.1.0
1.1.1
1.1.3
1.2
1.11
1.20


2 commentaires

Cela a fonctionné comme un charme, mais j'ai utilisé Linq comme celui-ci pour éviter les erreurs: Liste Lalltititlessed = dalltititles.orderby (x => rembourré (x.value.titlenumber))). Sélectionnez (O => O.Value ) .Toliste ();


Merci beaucoup pour votre aide!



0
votes

Une classe que vous pouvez implémenter pour contrôler plus correctement le Versioning. XXX PRE>

avec un exemple sur la façon de l'utiliser: P>

var t1 = new TitleNumber("5.34.20");
var t2 = new TitleNumber("4");
var t3 = new TitleNumber("5.34");
var t4 = new TitleNumber("5.34.20.1");
var t5 = new TitleNumber("5.35");

var l = new List<TitleNumber>() { t1, t2, t3, t4, t5 };
var r = l.OrderBy(x => x).ToList();


1 commentaires

Merci, je vais le tester!