Linq 订购清单<;T>;
我有一个名为jobList的自定义对象列表。列表有很多字段,但我想按两个字段排序,FolderID和JobName。列表如下所示: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
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
在和上运行。