LINQ.OrderBy单个字母,然后另一个字母

时间:2010-07-12 09:19:14

标签: c# linq sorting lambda

我试图用Linq做一个特殊的命令。 它必须按S然后按P然后NB然后V然后NC。 我不确定它是否是解决这个问题的最好方法,但这就是我所拥有的:

repeater.DataSource = query.OrderBy(p => p.Title ?).ThenBy(?).ThenBy(?);

3 个答案:

答案 0 :(得分:6)

如果你在字段中只有那些不同的值,那么你可以使用字典将字符串翻译成合适的数字,如下所示:

var order = new Dictionary<string, int>();
order.Add("S", 0);
order.Add("P", 1);
order.Add("NB", 2);
order.Add("V", 3);
order.Add("Nc", 4);
repeater.DataSource = query.OrderBy(p => order[p.Title]);

如果源是LINQ to SQL,则必须首先将其实现到列表中,以便您使用LINQ to Objects进行排序:

repeater.DataSource = query.ToList().OrderBy(p => order[p.Title]);

答案 1 :(得分:4)

您应该使用OrderBy<TSource, TKey>(IEnumerable<TSource>, Func<TSource, TKey>, IComparer<TKey>)签名并为此案例编写自己的比较器。

答案 2 :(得分:1)

query.OrderBy(p => p.Title, new MySpecialComparer());

public class MySpecialComparer : IComparer<string>
{
    private static Dictionary<string, int> parser = new Dictionary<string, int>();

    static MySpecialComparer()
    {
      parser.Add("S", 0);
      parser.Add("P", 1);
      parser.Add("NB", 2);
      parser.Add("V", 3);
      parser.Add("NC", 4);
    }


    public int Compare(string x, string y)
    {
        return parser[x] - parser[y];
    }
}