2009-10-23 3 views
1

Dans le contrôle ObjectListView (http://objectlistview.sourceforge.net/html/cookbook.htm), j'essaie d'ajouter un trieur personnalisé où il ignore les préfixes "The" et "A".ObjectListView: Sorter personnalisé

J'ai réussi à le faire avec un ListView régulier, mais maintenant que je suis passé à ObjectListView (beaucoup plus de fonctionnalités et de facilité), je ne peux pas sembler faire la même chose.

Voici le comparateur principal dans le code ObjectListView je pense ...

public int Compare(object x, object y) 
    { 
     return this.Compare((OLVListItem)x, (OLVListItem)y); 
    } 

Sorter original pour croissant, à titre d'exemple (Ignorer "A" et "The")

public class CustomSortAsc : IComparer 
     { 
      int IComparer.Compare(Object x, Object y) 
      { 
       string[] px = Convert.ToString(x).Split(' '); 
       string[] py = Convert.ToString(y).Split(' '); 
       string newX = ""; 
       string newY = ""; 

       for (int i = 0; i < px.Length; i++) 
       { 
        px[i] = px[i].Replace("{", ""); 
        px[i] = px[i].Replace("}", ""); 
       } 
       for (int i = 0; i < py.Length; i++) 
       { 
        py[i] = py[i].Replace("{", ""); 
        py[i] = py[i].Replace("}", ""); 
       } 

       if ((px[1].ToLower() == "a") || (px[1].ToLower() == "the")) 
       { 
        if (px.Length > 1) 
        { 
         for (int i = 2; i < px.Length; i++) 
          newX += px[i]; 
        } 
       } 
       else 
       { 
        for (int i = 1; i < px.Length; i++) 
         newX += px[i]; 
       } 

       if ((py[1].ToLower() == "a") || (py[1].ToLower() == "the")) 
       { 
        if (py.Length > 1) 
        { 
         for (int i = 2; i < py.Length; i++) 
          newY += py[i]; 
        } 
       } 
       else 
       { 
        for (int i = 1; i < py.Length; i++) 
         newY += py[i]; 
       } 


       return ((new CaseInsensitiveComparer()).Compare(newX, newY)); 
      } 
+0

Pouvez-vous ajouter plus d'informations, comme quel type de résultat obtenez-vous, comment raccordez-vous CustomSortAsc à la liste, etc.? – Ludovic

Répondre

1

installer un délégué CustomSorter, et en ce que délégué, mettre sur le ListItemSorter ObjectListView

this.incidentListView.CustomSorter = delegate(OLVColumn column, SortOrder order) { 
    this.incidentListView.ListViewItemSorter = new CustomSortAsc(); 
}; 

Voir this recipe on sorting

Mieux que de faire tout ce travail sur chaque comparaison, mettre en cache la valeur de tri sur chacun de vos objets de modèle. Si la valeur est "{The} Yards entiers", stockez "whole nine yards" et effectuez une comparaison de chaînes simple (et rapide) sur ces valeurs.

ObjectListView a ses own forum.

2

Bien que cela n'ait rien à voir avec votre problème, puis-je suggérer des améliorations de code? Apparemment, vos objets x et y d'origine sont des mots séparés par des espaces. Je ne sais pas si c'est intentionnel que vous ne les rejoignez pas avec des espaces, mais je l'ai gardé comme ça.

public static class Extensions 
{ 
    public static IEnumerable<T> SkipIf<T>(this IEnumerable<T> items, Predicate<T> pred) 
     { 
      return pred(items.First()) ? items.Skip(1) : items; 
     } 
} 

public class CustomSortAsc : IComparer 
{ 
    int IComparer.Compare(Object x, Object y) 
    { 
     var ignorePredicates = new List<string> { "a", "the" }; 
     var px = Convert 
        .ToString(x) 
        .Replace("{", "") 
        .Replace("}", "") 
        .Split(' ') 
        .SkipIf(s => ignorePredicates.Contains(s.ToLower())) 
        .ToArray(); 

     var py = Convert 
        .ToString(y) 
        .Replace("{", "") 
        .Replace("}", "") 
        .Split(' ') 
        .SkipIf(s => ignorePredicates.Contains(s.ToLower())) 
        .ToArray(); 

     var newX = string.Join("", px); 
     var newY = string.Join("", py); 

     return string.Compare(newX, newY, true); 
    } 
} 

Vous pouvez simplement utiliser SkipWhile<> mais sauterait plusieurs « un » et « le » au début. Ça pourrait aller - alors vous n'avez pas besoin de l'extension SkipIf<>.

Questions connexes