我有一个像这样的字符串数组:
string[] names = new string[] { "john", "paul", "ringo", "george", "janis" };
我想使用自定义条件对此数组进行排序。它不能按字母顺序排列。它可能按此顺序排列:pgrj
。
我试图实现一个新的IComparer
,但在Compare()
方法中我不能使用string.Compare因为它会按字母顺序排序而我不想这样做。< / p>
问题是:如何按以下顺序对名称数组进行排序:pgrj?在'j'的情况下。贾尼斯可能在约翰之前。
感谢。
答案 0 :(得分:2)
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;
}
};
答案 1 :(得分:2)
我会按照它们应该排序的顺序制作一个字母表的数组。我们称这个数组为sort
。然后你可以做类似
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;
现在有一些免责声明。
您可以通过创建自定义类来为每个角色分配权重来改进这一点。
class CustomAlphabetSort
{
public char Character { get; set; }
public int Weight { get; set; }
}
从这里你可以对字符串的每个字母的值求和,并以这种方式进行比较。它可能比你的情况要复杂一点