Linq 订购清单<;T>;

Linq 订购清单<;T>;,linq,generics,Linq,Generics,我有一个名为jobList的自定义对象列表。列表有很多字段,但我想按两个字段排序,FolderID和JobName。列表如下所示: job.FolderID = 3 job.JobName = "oper01_quick" job.FolderID = 3 Job.JobName = "oper02_quick" job.FolderID = 1 job.JobName = "min01_selfie" job.FolderID = 2 job.JobName = "max01_exper

我有一个名为jobList的自定义对象列表。列表有很多字段,但我想按两个字段排序,FolderID和JobName。列表如下所示:

job.FolderID = 3
job.JobName = "oper01_quick"

job.FolderID = 3
Job.JobName = "oper02_quick"

job.FolderID = 1
job.JobName = "min01_selfie"

job.FolderID = 2
job.JobName = "max01_experion"

job.FolderID = 2
job.JobName = "max02_experion"
job.FolderID = 1
job.JobName = "min01_selfie"

job.FolderID = 2
job.JobName = "max01_experion"

job.FolderID = 2
job.JobName = "max02_experion"

job.FolderID = 3
job.JobName = "oper01_quick"

job.FolderID = 3
Job.JobName = "oper02_quick"
job.FolderID = 1
job.JobName = "min01_selfie"

job.FolderID = 2
job.JobName = "max01_experion"

job.FolderID = 3
job.JobName = "oper01_quick"

job.FolderID = 2
job.JobName = "max02_experion"

job.FolderID = 3
Job.JobName = "oper02_quick"
我想对该列表进行排序,使其显示如下:

job.FolderID = 3
job.JobName = "oper01_quick"

job.FolderID = 3
Job.JobName = "oper02_quick"

job.FolderID = 1
job.JobName = "min01_selfie"

job.FolderID = 2
job.JobName = "max01_experion"

job.FolderID = 2
job.JobName = "max02_experion"
job.FolderID = 1
job.JobName = "min01_selfie"

job.FolderID = 2
job.JobName = "max01_experion"

job.FolderID = 2
job.JobName = "max02_experion"

job.FolderID = 3
job.JobName = "oper01_quick"

job.FolderID = 3
Job.JobName = "oper02_quick"
job.FolderID = 1
job.JobName = "min01_selfie"

job.FolderID = 2
job.JobName = "max01_experion"

job.FolderID = 3
job.JobName = "oper01_quick"

job.FolderID = 2
job.JobName = "max02_experion"

job.FolderID = 3
Job.JobName = "oper02_quick"
我想如果我做了这个LINQ OrderBy然后

jobList.OrderBy(j => j.FolderID).ThenBy(j => j.JobName);
它将实现这一点。但事实并非如此。它使订单看起来像这样:

job.FolderID = 3
job.JobName = "oper01_quick"

job.FolderID = 3
Job.JobName = "oper02_quick"

job.FolderID = 1
job.JobName = "min01_selfie"

job.FolderID = 2
job.JobName = "max01_experion"

job.FolderID = 2
job.JobName = "max02_experion"
job.FolderID = 1
job.JobName = "min01_selfie"

job.FolderID = 2
job.JobName = "max01_experion"

job.FolderID = 2
job.JobName = "max02_experion"

job.FolderID = 3
job.JobName = "oper01_quick"

job.FolderID = 3
Job.JobName = "oper02_quick"
job.FolderID = 1
job.JobName = "min01_selfie"

job.FolderID = 2
job.JobName = "max01_experion"

job.FolderID = 3
job.JobName = "oper01_quick"

job.FolderID = 2
job.JobName = "max02_experion"

job.FolderID = 3
Job.JobName = "oper02_quick"
有人能帮我把清单订好吗

谢谢

嚼狗

jobs.OrderBy(j => j.JobName).OrderBy(j => j.FolderId)

看起来很好用

我只能看到一种可能的解释:您没有将
OrderBy
/
ThenBy
结果分配回源变量

这些方法(以及整个LINQ)不会更改源集合。取而代之的是,他们创建了新的集合,并对元素进行了排序。这就是您必须重新分配它的原因:

jobList = jobList.OrderBy(j => j.FolderID).ThenBy(j => j.JobName).ToList();
要对列表进行适当排序,您必须使用带有自定义比较器的
排序
方法:

public class JobComparer : IComparer<Job>
{
    public int Compare(Job x, Job y)
    {
        var folderDifference = x.FolderId.CompareTo(y.FolderId);
        return folderDifference == 0 ? x.JobName.CompareTo(y.JobName) : folderDifference;
    }
}

如果您的
作业
类如下所示:

public class Job
{
    public int FolderId { get; set; }

    public string JobName { get; set; }
}
然后执行
IComparer

这将给出您的预期结果。以下是
LINQPad
中的输出:


您的排序方式是正确的,但您需要将其分配给一个变量,以获得结果的排序集合:

请参见.NET小提琴:

这基本上就是它所做的:

var sortedJobs = jobs.OrderBy(j => j.FolderID).ThenBy(j => j.JobName);

foreach(var job in sortedJobs){
    Console.WriteLine(job.FolderID + " " + job.JobName);
}

我们是否可以假设
FolderID
int
JobName
字符串
?您是否可以共享实际的代码,而不只是在代码块中写出某种内容的列表?您是否将
OrderBy()的结果分配给了某个对象?然后,您是否将
调用的结果分配给了某个对象?这些方法排序不到位。我创建了一个反映您的
Job
类,然后对
OrderBy
ThenBy
使用相同的调用,并正确排序。Marcin正确地指出列表没有得到适当的排序-您需要将方法的结果分配给某个对象。如果他没有分配,那么他应该得到与原始列表相同的结果。但是结果不同,所以这不是问题所在problem@Selman22我看不出有什么不同的解释。即使
FolderId
是一个字符串,它也会对
“2”
“3”
项进行正确排序…是的,但在第一次排序之后,它是按作业名排序的,
“3,oper01\u quick”
位于
“2,max02\u experion”之前
@Selman22但
ThenBy
仅适用于被认为与先前排序定义相等的子项组,因此
作业名
将仅检查相同的
FolderId
值。嗯,我不知道。看起来你是对的,我尝试了那个查询,结果是正确的。但是仍然不明白OP是如何得到不同的结果的。你不是想在第二个操作符上使用
ThenBy
OrderBy
忽略任何以前的排序。不,这正是我在LINQPAD中使用的语法,我猜第二个OrderBy应用于第一个OrderBy的结果。它是。但是一会儿。(…)(…)区别在于后面的和论点
OrderBy
在和上运行,而
ThenBy
在和上运行。