2009-10-08 2 views
3

В настоящее время я делаю для себя мини-музыкальный проигрыватель/органайзер. Однако, при использовании в виде списка, он сортирует в алфавитном порядке, и не игнорировать "The" и "A":Игнорировать «The» и «A» при сортировке списка в C#

  1. A Lot Like Me
  2. Adiago Для струнного
  3. Stay хрустящих
  4. The Foresaken
  5. Время Притворись

должно быть:

  1. Adiago Для струнных
  2. Foresaken
  3. A Lot Like Me
  4. Stay Хрустящие
  5. Time To Притворись

Это все загружается из многомерного массива, и я даже пытался отфильтровывая «The» и «A» вручную, а затем отображать реальное имя (из другого массива), но затем просто сортирует отображаемое имя (включая «The» и «A»)

ответ

5

Что вы можете сделать, так это создать клиента comparer и установить его на свой ListView экземпляр, используя свойство ListView.ListViewItemSorter. Затем ваш компаньон несет ответственность за повторение «the» и «a» с начала сравниваемых предметов.

Когда ваш ListView отсортирован, он будет использовать этот пользовательский сопоставитель для сортировки, но исходные значения, включая «a» и «a», будут использоваться в качестве отображаемых значений в ListView (то есть вам не нужно изменять значения, которые вы помещаете в ListView - компаратор просто игнорирует слова, которые вы хотите использовать при сортировке).

0

Вы может сделать это с помощью метода пользовательского сравнения, как это:

using System; 
using System.Collections.Generic; 
using System.Text.RegularExpressions; 

class Example 
{ 
    static void Main() 
    { 
     List<String> names = new List<String> 
     { 
      "A Lot Like Me", 
      "Adiago For Strings", 
      "Stay Crunchy", 
      "The Foresaken", 
      "Time to Pretend" 
     }; 

     names.Sort(smartCompare); 
    } 

    static Regex smartCompareExpression 
     = new Regex(@"^(?:A|The)\s*", 
      RegexOptions.Compiled | 
      RegexOptions.CultureInvariant | 
      RegexOptions.IgnoreCase); 

    static Int32 smartCompare(String x, String y) 
    { 
     x = smartCompareExpression.Replace(x, ""); 
     y = smartCompareExpression.Replace(y, ""); 

     return x.CompareTo(y); 
    } 
} 

Регулярное выражение срывает любые ведущие «A» или «» из строк так, что они не влияют на сравнение.

1

Этот подход LINQ, кажется, работает:

string[] input = new string[] { 
    "A Lot Like Me", 
    "Adiago For Strings", 
    "Stay Crunchy", 
    "The Foresaken", 
    "Time to Pretend" 
}; 

IEnumerable<string> ordered = input.OrderBy(s => 
    s.StartsWith("A ", StringComparison.OrdinalIgnoreCase) || s.StartsWith("The ", StringComparison.OrdinalIgnoreCase) ? 
    s.Substring(s.IndexOf(" ") + 1) : 
    s); 

foreach (var item in ordered) 
{ 
    Console.WriteLine(item); 
} 

Он отсекает ведущий «а» и «» из сравнения, но не изменяет значения в списке.

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