目前我正在为自己制作一个迷你音乐播放器/组织者。但是,在使用列表视图时,它按字母顺序排序,并且不会忽略“The”和“A”:
应该是:
它全部是从多维数组加载的,我甚至尝试过滤掉“The”和“A”,然后显示真实姓名(来自不同的数组),但之后它只是对显示的内容进行排序名称(包括“The”和“A”)
答案 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”,但不会改变列表中的值。