在C#中排序列表视图时忽略“The”和“A”

问题描述:

目前我正在为自己制作迷你音乐播放器/组织器。然而,使用列表视图时,按字母顺序排序,并没有忽略 “的” 和 “A”:在C#中排序列表视图时忽略“The”和“A”

  1. 也蛮像我
  2. Adiago字符串
  3. 保持松脆
  4. 的Foresaken
  5. 时间假装

应该是:

  1. Adiago字符串
  2. 的Foresaken
  3. 也蛮像我
  4. 保持松脆
  5. 时间假装

这一切都从一个多维数组装载,我甚至已经试过手动过滤出“The”和“A”,然后显示真实姓名(来自不同的阵列),但是它只是将显示的名称(包括“The”和“A”)排序。

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

当你ListView进行排序,它会使用这个自定义比较与排序,但原有的价值观,包括“中”和“a”将被用作显示值ListView(即你不需要修改您在ListView中输入的值 - 比较器只是在分类时忽略您希望的字词)。

You可以用这样一个自定义的比较方法做到这一点:

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”或“中的”从字符串,以便它们不会影响比较。

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

它除掉领导“一”和“”从比较,但不改变在列表中的值。