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

本文关键字:顺序 数组 排序 词法 自定义 何使用 比较器 | 更新日期: 2023-09-27 18:34:30

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