在C#中对列表视图进行排序时,忽略单词"The"和"A"。

4

目前我正在为自己制作一个迷你音乐播放器/组织者。然而,在使用列表视图时,它按字母顺序排序,并且不忽略 "The" 和 "A":

  1. A Lot Like Me
  2. Adiago For Strings
  3. Stay Crunchy
  4. The Foresaken
  5. Time to Pretend

应该是:

  1. Adiago For Strings
  2. The Foresaken
  3. A Lot Like Me
  4. Stay Crunchy
  5. Time To Pretend

所有内容都从多维数组加载,我甚至尝试手动过滤掉 "The" 和 "A",然后显示真实名称(来自另一个数组),但这样它只会按照显示的名称排序(包括 "The" 和 "A")。

3个回答

6
你可以创建一个比较器并将其设置在ListView实例上,使用ListView.ListViewItemSorter属性。然后,您的比较器负责从要进行比较的项的开头删除“the”和“a”。当您的ListView排序时,它将使用此自定义比较器进行排序,但原始值包括“the”和“a”将用作在ListView中显示的值(即,您不需要修改放入ListView中的值 - 比较器只会在排序时忽略您想要忽略的单词)。

2
你可以使用自定义比较方法来完成这个操作,例如:
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 ",以免影响比较。

2
这个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 ",但不会改变列表中的值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接