如何使用自定义Comparer以不同的词法顺序对数组进行排序?

时间:2016-02-14 17:24:02

标签: c# sorting compare

所以,我对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;
    }
}

我有一个充满单词的数组。 我多么可以使用这个比较排序?

3 个答案:

答案 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 。)