C# 列出自定义排序
我有一个项目列表,需要以非常特殊的方式进行排序 举个例子:C# 列出自定义排序,c#,linq,sorting,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 P
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
};
}
公共类PayStubDetailItem
{
公共字符串代码{get;set;}
}
void Main()
{
var bonus=新的PayStubDetailItem(){Code=“bonus”};
var ot=新的PayStubDetailItem(){Code=“ot”};
var reg=新的PayStubDetailItem(){Code=“reg”};
var otPrem=new PayStubDetailItem(){Code=“otPrem”};
var tps=new PayStubDetailItem(){Code=“3ps”};
变量列表=新列表{
奖金、加班费、注册费、加班费、tps
};
}
我的要求是排序应如下所示:
Reg、OT、OTPrem、Alpha按代码排序
用文字解释,若列表包含“Reg”代码,则应放在第一位,若列表还包含“OT”,则应放在Reg之后,以此类推。。所有代码与这三个不同的项目应按字母顺序排序
在我的示例中,排序列表应如下所示:
注册、OT、OTPrem、3P、奖金
要做到这一点,最优雅的方式是什么?也许,可以使用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();
var subList=list.Where(i=>i.code!=“OT”&i.code!=“Reg”&i.code!=“OTPrem”);
subList=subList.OrderBy(l=>l.Code);
var newList=新列表();
if(list.Select(c=>c.Code).Contains(“Reg”))
{
添加(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”))
{
添加(list.Where(i=>i.Code==“OTPrem”).FirstOrDefault());
}
newList.AddRange(子列表);
newList.Dump();
谢谢因为您的排序逻辑对于您的问题非常独特,所以我建议您在接口上实现一个,然后调用您的列表
class MyComparer : IComparer<PayStubDetailItem>
{
public int Compare(PayStubDetailItem x, PayStubDetailItem y)
{
//Your implementation
}
}
class MyComparer:IComparer
{
公共整数比较(PayStubDetailItem x、PayStubDetailItem y)
{
//您的实现
}
}
您可以这样使用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
将完成字母部分。LINQ似乎很好。你试过了吗?@DavidL我用我目前的尝试更新了我的帖子,但我不喜欢。真难看,这就是我所说的优雅!我非常感谢@IvanStoev