在C#中排序列表视图时忽略“The”和“A”
问题描述:
目前我正在为自己制作迷你音乐播放器/组织器。然而,使用列表视图时,按字母顺序排序,并没有忽略 “的” 和 “A”:在C#中排序列表视图时忽略“The”和“A”
- 也蛮像我
- Adiago字符串
- 保持松脆
- 的Foresaken
- 时间假装
应该是:
- Adiago字符串
- 的Foresaken
- 也蛮像我
- 保持松脆
- 时间假装
这一切都从一个多维数组装载,我甚至已经试过手动过滤出“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);
}
它除掉领导“一”和“”从比较,但不改变在列表中的值。