Linq OrderBy自定义订单

ser*_*0ne -3 c# linq

假设我有以下char数组:

char[] c = new char[] { 'G', 'R', 'D', 'D', 'G', 'R', 'R', 'C', 'D', 'G', 'R', 'R', 'C', 'G', 'R', 'D', 'D', 'G', 'R', 'R', 'C', 'D', 'G', 'R', 'R', 'C' };


c.OrderBy(y => y).ForEach(x => Console.WriteLine(x));
//CCCCDDDDDDGGGGGGRRRRRRRRRR
Run Code Online (Sandbox Code Playgroud)

如何使用linq生成以下订单?

//DDDDDDGGGGGGRRRRRRRRRRCCCC
Run Code Online (Sandbox Code Playgroud)

Per*_*t28 19

可能你想做这样的事情:

char [] customOrder = { 'D', 'G', 'R', 'C'}; 
char [] c = new char[] { 'G', 'R', 'D', 'D', 'G', 'R', 
                         'R', 'C', 'D', 'G', 'R', 'R', 
                         'C', 'G', 'R', 'D', 'D', 'G', 
                         'R', 'R', 'C', 'D', 'G', 'R', 'R', 'C' };

foreach (char item in c.OrderBy(ch => Array.IndexOf(customOrder, ch))) {
    Console.Write(item); 
}
Run Code Online (Sandbox Code Playgroud)


Tim*_*ter 5

您可以使用另一个定义顺序的集合:

char[] order = {'D','G','R','C'};
var customOrder = c.OrderBy(chr =>
{
    int index = Array.IndexOf(order, chr);
    if (index == -1) return int.MaxValue;
    return index;
});
Run Code Online (Sandbox Code Playgroud)


Eup*_*ric 5

如果您想将订单定义为项目之间的关系,那么您必须将IComparer与其他OrderBy 方法一起使用。

public class Comparer : IComparer<char>
{
    public int Compare(Char a, Char b)
    {
       //return positive if a should be higher, return negative if b should be higher
    }
}

c.OrderBy(c => c, new Comparer()).ForEach(x => Console.WriteLine(x));
Run Code Online (Sandbox Code Playgroud)