我有一个需要以非常特殊的方式排序的项目列表。
举个例子:
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();
由于
答案 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
}
}