在C#中对listview进行排序时忽略“The”和“A”

时间:2009-10-08 22:27:45

标签: c# .net sorting listview

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

  1. 很喜欢我
  2. Adiago For Strings
  3. 保持脆脆
  4. The Foresaken
  5. 时间假装
  6. 应该是:

    1. Adiago For Strings
    2. The Foresaken
    3. 很喜欢我
    4. 保持脆脆
    5. 时间假装
    6. 它全部是从多维数组加载的,我甚至尝试过滤掉“The”和“A”,然后显示真实姓名(来自不同的数组),但之后它只是对显示的内容进行排序名称(包括“The”和“A”)

3 个答案:

答案 0 :(得分:6)

您可以做的是创建一个客户comparer并使用ListView.ListViewItemSorter属性在ListView实例上设置它。然后,您的比较器负责从被比较项目的开始转移“the”和“a”。

当您对ListView进行排序时,它将使用此自定义比较器进行排序,但包含“the”和“a”的原始值将用作ListView中的显示值(即。你不需要修改放在ListView中的值 - 比较器只是忽略了排序时你想要的单词。)

答案 1 :(得分: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 :(得分: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”,但不会改变列表中的值。