Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 列出自定义排序_C#_Linq_Sorting - Fatal编程技术网

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