Игнорировать «The» и «A» при сортировке списка в C # - PullRequest
4 голосов
/ 09 октября 2009

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

  1. Много, как я
  2. Adiago For Strings
  3. Оставайся Хрустящим
  4. Оставлено
  5. Время притворяться

должно быть:

  1. Adiago For Strings
  2. Оставлено
  3. Много, как я
  4. Stay Crunchy
  5. Время притворяться

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

Ответы [ 3 ]

6 голосов
/ 09 октября 2009

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

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

2 голосов
/ 09 октября 2009

Этот подход 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);
}

Он удаляет начальные "a" и "the" из сравнения, но не изменяет значения в списке.

2 голосов
/ 09 октября 2009

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

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" или "The" из строк, чтобы они не влияли на сравнение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...