列表自定义排序

时间:2016-09-08 21:18:03

标签: c# linq sorting

我有一个需要以非常特殊的方式排序的项目列表。

举个例子:

public class PayStubDetailItem
{ 
    public string Code { get; set; }
}

void Main()
{
    var bonus = new PayStubDetailItem() { Code = "Bonus" };
    var ot = new PayStubDetailItem() { Code = "OT"};
    var reg = new PayStubDetailItem() { Code = "Reg"};
    var otPrem = new PayStubDetailItem() { Code = "OTPrem"};
    var tps = new PayStubDetailItem() { Code = "3ps"};

    var list = new List<PayStubDetailItem> {
        bonus, ot, reg, otPrem, tps
    };
}

我的要求规定排序应如下: Reg,OT,OTPrem,Alpha-sort by code。

用文字解释,如果列表包含'Reg'代码,它应该首先出现,如果它还包含'OT',它应该在Reg等之后。所有代码与特定代码不同的项应该按字母顺序排序。

在我的示例中,排序列表应如下所示: Reg,OT,OTPrem,3ps,Bonus

最优雅的方法是什么?也许,使用LINQ或自定义比较器。

这是我到目前为止所尝试的,但它是详细说明:

var subList = list.Where(i => i.Code != "OT" && i.Code != "Reg" && i.Code != "OTPrem");
subList = subList.OrderBy(l => l.Code);
var newList = new List<PayStubDetailItem>();
if (list.Select(c => c.Code).Contains("Reg"))
{
    newList.Add(list.Where(i => i.Code == "Reg").FirstOrDefault());
}
if (list.Select(c => c.Code).Contains("OT"))
{
    newList.Add(list.Where(i => i.Code == "OT").FirstOrDefault());
}
if (list.Select(c => c.Code).Contains("OTPrem"))
{
    newList.Add(list.Where(i => i.Code == "OTPrem").FirstOrDefault());
}
newList.AddRange(subList);
newList.Dump();

由于

2 个答案:

答案 0 :(得分:1)

您可以像这样使用Linq:

var result = list.
    .OrderBy(c => c.Code == "Reg" ? 0 : c.Code == "OT" ? 1 : c.Code == "OTPrem" ? 2 : 3)
    .ThenBy(c => c.Code)
    .ToList();

OrderBy表达式将为您提供所需的优先顺序,而ThenBy将按字母顺序排列。

答案 1 :(得分:0)

由于您的排序逻辑对您的问题非常独特,我建议您实施IComparer(T)界面,然后在列表中调用Sort(IComparer(T))

class MyComparer : IComparer<PayStubDetailItem>
{
    public int Compare(PayStubDetailItem x, PayStubDetailItem y)
    {
        //Your implementation
    }
}