所以,我对C#很陌生,我正在尝试使用自定义Comparer订购数组。
我创建了一个类:
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;
}
}
我有一个充满单词的数组。 我多么可以使用这个比较排序?
答案 0 :(得分:4)
我认为你需要的就是这个。声明一种排序方法,就像你已经做的那样。
public static int CompareStrings(string s1, string s2)
{
// TODO: your code here
}
...并指定您需要使用的功能。
string[] myStrings = { ... };
Array.Sort(myStrings, CompareStrings);
如果您使用泛型类,您可以按照以下方式实现此目的:
List<string> myStrings = ...;
myStrings.Sort(CompareStrings);
答案 1 :(得分:1)
要了解SimplyMe的答案,请查看本教程:https://support.microsoft.com/en-us/kb/320727。它将为您提供所有细节。
答案 2 :(得分:0)
要希望使用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());
与您在“我的回答”下突出显示的某些问题有关的重要说明:
在知道要比较的类型时,总是最好使用通用接口,因为这尤其会在编译时而不是运行时(当您收到{{1} }),如果您要对 words 数组进行排序,并假设一个单词是InvalidCastException
,则您实现的string
不适合用于此目的,因为它会比较两个{ {1}}类型。
(根据我通过查看代码得出的结论,我认为您需要做的是实现IComparer
,并在char
方法中迭代两个字符串的每个IComparer<string>
,直到它们是不同的,然后使用您的Compare
比较逻辑-但是,您还应该考虑如何处理大写和小写字母,当一个或两个字符不在列表中并且如果其中一个char
时如何处理它的整体与其他char
的第一部分匹配,例如 match 和 matches 。)