2017-02-06 1 views
1

J'ai obtenu ce code dans le contrôleur mvc3 asp.net pour la vue et l'ordre dans une liste déroulante. Mais mon problème est que vous pouvez voir dans l'image ci-dessous l'ordre par text and next to it the number. Comment résoudre ce problème?Comment réparer l'ordre par?

ViewBag.AddrBarangay = new SelectList(db.Barangays, "BarangayId", "BarangayName", "").OrderBy(m => m.Text); 

enter image description here

+0

Pouvez-vous s'il vous plaît laissez-moi savoir, le numéro est avec le texte ou sa colonne séparée? ou vous concaténéz les deux? comprends-tu mon point? – Rajpurohit

+0

@Rajpurohit c'est avec le texte. – KiRa

+0

vous voulez dire "BarangayName" colonne contient "Barangay 1", "Barangay 101" droite? – Rajpurohit

Répondre

3

Pour votre cas, vous devez créer un nouveau qui peut trier Comparer en lexicograhical order Vous devez avoir votre propre implémentation de l'interface comparateur qui implémente IComparer<string>. Votre comparateur devrait ressembler à ceci:

public class LexicoComparer : IComparer<string> 
{ 
    public int Compare(string x, string y) 
    { 
     var firstArgumentSplits = x.Split(' '); 
     var secondArgumentSplits = y.Split(' '); 

     if (firstArgumentSplits.Length == 2 && secondArgumentSplits.Length == 2) 
     { 
      int firstArgumentInt, secondArgumentInt; 
      if (firstArgumentSplits[0] == secondArgumentSplits[0]) 
      { 
       if (int.TryParse(firstArgumentSplits[1], out firstArgumentInt)) 
       { 
        if (int.TryParse(secondArgumentSplits[1], out secondArgumentInt)) 
        { 
         return firstArgumentInt == secondArgumentInt ? 0 : firstArgumentInt > secondArgumentInt ? 1 : 0; 
        } 

       } 
      } 
     } 


     return String.Compare(x, y); 
    } 
} 

Maintenant, vous utilisez plus haut comparateur dans OrderBy:

ViewBag.AddrBarangay = new SelectList(db.Barangays, 
     "BarangayId", "BarangayName", "").OrderBy(m => m.Text, 
             new LexicoComparer()); 
+0

Pourquoi est-ce en ordre décroissant? – KiRa

+0

Oups !!! Désolé, même si j'avais OrderBy dans mon esprit mais écrit OrderByDescending. Corrigé –

+0

Vous avez obtenu une erreur (l'index était en dehors des limites du tableau.) Si certaines de mes données ne contenaient pas de nombre ou de texte à deux mots. Exemple 'Brgy1, Brgy2' il fonctionnera dans' Brgy1 1, Brgy1 2' En raison de la ligne 'int.TryParse (firstArgumentSplits [1]' – KiRa

2

Bien que mon humble avis la meilleure façon de résoudre ce serait de stocker les valeurs telles que 1,10,100 dans SelectList valeur propriété et le thensort. Si, pour une raison ou une autre, vous ne pouvez pas le faire, vous devez fournir le code EqualityComparer dans la clause OrderBy.

De plus, si votre texte Barangay serait toujours rester constante alors vous pouvez le faire de cette façon aussi (mais pas une très bonne approche car il est non générique): -

int maxSize = db.Barangays.Max(x => x.Text.Length); 
ViewBag.AddrBarangay = new SelectList(db.Barangays, "BarangayId", "BarangayName", "") 
       .OrderBy(m => m.Text.Replace("Barangay","").Trim().PadLeft(maxSize ,'0')); 
+0

que signifie cette ligne? 'x => x.Text.Length' Je sais qu'il aura la longueur d'un texte. Expliquez un peu. – KiRa

+0

@KiRa - Dans 'maxSize' nous déterminons d'abord quelle est la longueur maximale de votre chaîne, comme' Barangay 1' donnera _10_ caractères alors que 'Barangay 100' produirait _12_ caractères donc sur la clause _OrderBy_ d'abord nous supprimons le texte commun' Barangay' et ensuite remboursez '0' supplémentaire sur la gauche de sorte que tout le texte entier devienne de la même longueur que' 010,100,011', etc et alors 'OrderBy' vous donnera un résultat correct. –

+0

pour ce que je comprends (corrigez-moi si je me trompe) il obtiendra seulement les premières données dans tous les dossiers. – KiRa