所以,我对C#很陌生,我正在尝试使用自定义比较器对数组进行排序。
我创建了一个类:
class MySorter : IComparer
{
public int Compare(object x, object y)
{
var chars = "jngmclqskrzfvbwpxdht";
if (chars.IndexOf((char)x) < chars.IndexOf((char)y))
return -1;
return chars.IndexOf((char)x) > chars.IndexOf((char)y) ? 1 : 0;
}
}
我有一个充满单词的数组。我可以使用这个比较进行排序的程度如何?
我认为你需要的是这个。像您已经做的那样声明一个排序方法。
public static int CompareStrings(string s1, string s2)
{
// TODO: your code here
}
。并指定需要使用的功能。
string[] myStrings = { ... };
Array.Sort(myStrings, CompareStrings);
如果使用泛型类,也可以按如下方式实现此目的:
List<string> myStrings = ...;
myStrings.Sort(CompareStrings);
对于希望使用 Linq 的人来说,要回答这个问题,解决方案是:
IEnumerable<string> words = new [] {"foo", "bar"};
words = words.OrderBy(x => x, new MySorter());
因此,请注意,您应该为比较器使用通用接口:
class MySorter : IComparer<string>
{
public int Compare(string x, string y)
{
}
}
然后,可以使用 Linq 对偶数对象进行排序:
IEnumerable<Person> people = new []
{
new Person
{
Name = "Matthew"
},
new Person
{
Name = "Mark"
}
};
people = people.OrderBy(x => x.Name, new MySorter());
与你在Simply Me的回答中强调的一些问题有关的重要说明:
当要比较的类型已知时,使用通用接口总是更可取的,因为除其他外,这会在编译时而不是运行时(当您得到一个InvalidCastException
时(提醒您,如果您正在对单词数组进行排序,假设一个单词是string
,您正在实现的IComparer
不适合目的,因为它正在比较两种char
类型。
(从我通过查看您的代码推断的内容来看,我认为您需要做的是实现IComparer<string>
并在 Compare
方法中遍历两个字符串的每个char
,直到它们不同,然后使用您的char
比较逻辑 - 但是,您还应该考虑如何处理大写和小写, 当一个或两个字符不在列表中时,如果一个string
完全匹配另一个string
的第一部分,例如匹配和匹配,该怎么办。
匿名函数的内联解决方案。它将按字典顺序对字符串进行排序。
Array.Sort(arr, (a, b) => string.CompareOrdinal(a, b));
它会转
var arr = new[] { "orange", "banana", "apple", "watermelon", "tomato" };
到
string[5] { "apple", "banana", "orange", "tomato", "watermelon" }