C# 非字母顺序的字符串数组的自定义排序
我有一个如下的字符串数组:C# 非字母顺序的字符串数组的自定义排序,c#,.net,sorting,C#,.net,Sorting,我有一个如下的字符串数组: string[] names = new string[] { "john", "paul", "ringo", "george", "janis" }; 我想使用自定义条件对该数组进行排序。不能按字母顺序。可能是这样的顺序:pgrj 我试图实现一个新的IComparer,但是在Compare方法中我不能使用string.Compare,因为它会按字母顺序排序,我不想这样做 问题是:如何按以下顺序对名称数组排序:pgrj?在“j”案中。杰尼斯可能在约翰之前 谢谢。我
string[] names = new string[] { "john", "paul", "ringo", "george", "janis" };
我想使用自定义条件对该数组进行排序。不能按字母顺序。可能是这样的顺序:pgrj
我试图实现一个新的IComparer,但是在Compare方法中我不能使用string.Compare,因为它会按字母顺序排序,我不想这样做
问题是:如何按以下顺序对名称数组排序:pgrj?在“j”案中。杰尼斯可能在约翰之前
谢谢。我会把字母表中的字母按顺序排列起来。让我们称之为数组排序。然后你可以做类似的事情
void Main()
{
string[] names = new string[] { "john", "paul", "ringo", "george", "janis" };
var reorderedNames = names.OrderByDescending(x => x, new MyComparer());
}
class MyComparer : IComparer<string>{
int IComparer<string>.Compare(string s1, string s2){
char l1 = s1[0];
char l2 = s2[0];
int ret;
switch(l1){
case 'g': if(l2 == 'p'){
return -1;
}
else{
goto default;
}
case 'r': if(l2 == 'p' || l2 == 'g'){
return -1;
}
else{
goto default;
}
case 'j': if(l2 == 'p' || l2 == 'g' || l2 == 'r'){
return -1;
}
else{
goto default;
}
default: ret = (l2 != l1) ? 1 : s1.CompareTo(s2); return ret;
}
return ret;
}
};
for (int i = 0; i < s1.Length; i++)
{
int s1Value = sort.IndexOf(s1[i]);
int s2Value = sort.IndexOf(s2[i]);
if(s1Value > s2Value)
return 1;
if(s2Value > s1Value)
return -1;
}
return 0;
从这里,您可以对字符串中每个字母的值求和,并以这种方式进行比较。这可能比你的情况需要的复杂一点我会把字母表中的字母按顺序排列成一个数组。让我们称之为数组排序。然后你可以做类似的事情
for (int i = 0; i < s1.Length; i++)
{
int s1Value = sort.IndexOf(s1[i]);
int s2Value = sort.IndexOf(s2[i]);
if(s1Value > s2Value)
return 1;
if(s2Value > s1Value)
return -1;
}
return 0;
从这里,您可以对字符串中每个字母的值求和,并以这种方式进行比较。这可能比您的情况需要的复杂一点看这个答案,这个自定义顺序纯粹是基于重新排列字母表吗?换句话说,如果Janis排在John之前,那是因为a会排在o之前,不管它在单词中的位置如何?Eric Lippert在这些博客文章中提供了一些关于自定义排序的好提示:是的,这纯粹是基于重新排列字母表。我错了。我将列出字母表中的所有单词并重新排列。单词数组也可能被重新排列。我已经尝试在IComparer中使用StartWith。但是我只能用每个单词的第一个字母来排序。看到这个答案了吗?这个自定义顺序纯粹是基于字母表的重新排列吗?换句话说,如果Janis排在John之前,那是因为a会排在o之前,不管它在单词中的位置如何?Eric Lippert在这些博客文章中提供了一些关于自定义排序的好提示:是的,这纯粹是基于重新排列字母表。我错了。我将列出字母表中的所有单词并重新排列。单词数组也可能被重新排列。我已经尝试在IComparer中使用StartWith。但是我只能用每个单词的第一个字母来排序。我会试着增加这个想法。很好。我会试着增加这个想法。