2009-10-23 3 views
1

В элементе управления ObjectListView (http://objectlistview.sourceforge.net/html/cookbook.htm) я пытаюсь добавить собственный сортировщик, где он игнорирует префиксы «The» и «A».ObjectListView: Пользовательский сортировщик

Мне удалось сделать это с помощью обычного ListView, но теперь, когда я переключился на ObjectListView (намного больше функций и легкость), я не могу сделать то же самое.

Ниже Главный Comparer в коде ObjectListView я думаю ...

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

Оригинал сортировщик для восходящих, в качестве примера (Игнорирование "А" и "В")

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

Можете ли вы добавить дополнительную информацию, например, какой результат вы получаете, как вы подключаете CustomSortAsc со списком и т. Д.? – Ludovic

ответ

1

Установите CustomSorter делегата, и в этом делегат поставил ListItemSorter на ObjectListView

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

См. this recipe on sorting

Лучше, чем выполнять всю эту работу для каждого сравнения, кешируйте значение сортировки для каждого из объектов модели. Если значение «{The} Whole Nine Yards», сохраните «целые девять ярдов» и выполните простой (и быстрый) сопоставление строк по этим значениям.

У объектаListView есть own forum.

2

Хотя это не имеет ничего общего с вашей проблемой, я могу предложить некоторые улучшения кода? По-видимому, ваши исходные объекты x и y - это слова, разделенные пробелами. Не уверен, намеренно ли вы не присоединяться к ним с пробелами, но я сохранил это так.

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); 
    } 
} 

Вы могли бы просто использовать SkipWhile<> но пропускала множественным «а» и «» в самом начале. Может быть, все в порядке - тогда вам не нужно расширение SkipIf<>.

Смежные вопросы