2014-02-28 3 views
2

나는 jobList라는 사용자 지정 개체 목록이 있습니다. 목록에는 많은 필드가 있지만 FolderID와 JobName의 두 필드로 정렬하고 싶습니다. 목록은 다음과 같습니다주문 목록 <T>

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" 

그리고 내가 생각하는 나는이 LINQ있는 OrderBy, ThenBy을 한 경우 :

jobList.OrderBy(j => j.FolderID).ThenBy(j => j.JobName); 

이렇게하면됩니다. 그러나 그렇지 않습니다. 주문은 다음과 같습니다.

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" 

목록을 제대로 주문하는 사람은 누구입니까?

감사합니다,

Chewdoggie

+1

우리가 추측 할 수는'FolderID'는'int'과'JobName'는'string'은? –

+0

코드 블록에 일종의 물건 목록을 작성하는 대신 실제 코드를 공유 할 수 있습니까? –

+0

'OrderBy(). ThenBy' 호출의 결과를 할당 했습니까? 이러한 메소드는 제 위치에서 정렬되지 않습니다. 그들은 항목이 정렬 된 새 컬렉션을 만듭니다. – MarcinJuraszek

답변

0

enter image description here

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

잘 작동하는 것 같군.

+0

두 번째 연산자에서'ThenBy'를 사용하지 않으셨습니까? 'OrderBy'는 이전 주문을 무시합니다. –

+0

아니, 정확히 LINQPAD에서 사용한 구문입니다. 두 번째 orderby가 첫 번째 결과에 적용된 것 같습니다. –

+0

그렇습니다. 그러나 ['ThenBy'는 시퀀스의 요소를 오름차순으로 순차적으로 정렬합니다.] (http://msdn.microsoft.com/library/system.linq.enumerable.thenby.aspx "Enumerable.ThenBy Method") while [ 'OrderBy'는 시퀀스의 요소를 오름차순으로 정렬합니다. (http://msdn.microsoft.com/library/system.linq.enumerable.orderby.aspx "Enumerable.OrderBy Method"). (...) –

1

하나의 가능한 설명 만 볼 수 있습니다. OrderBy/ThenBy 결과를 소스 변수에 다시 할당하지 않습니다.

이러한 메서드 (및 전체 LINQ)는 원본 컬렉션을 변경하지 않습니다. 그 대신, 그들은 정렬 된 요소를 가진 새로운 콜렉션을 생성합니다.

jobList = jobList.OrderBy(j => j.FolderID).ThenBy(j => j.JobName).ToList(); 

당신이 Sort 방법을 사용해야 할 장소에 목록을 정렬하려면 사용자 정의 비교 자와 : 당신이 그것을 다시 할당해야하는 이유입니다

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; 
    } 
} 
jobList.Sort(new JobComparer()); 
+0

그는 그것을 할당하지 않으면 원래 목록으로 동일한 결과를 가져와야합니다. 그러나 결과가 다르므로 문제가되지 않습니다. –

+0

@ Selman22 다른 설명을 볼 수 없습니다. 'FolderId'가 문자열 일지라도''2 ''와''3'''항목을 올바르게 정렬합니다 ... – MarcinJuraszek

+0

네,하지만 첫 번째 정렬 후에 JobName 순으로 정렬됩니다,' "3, oper01_quick"' ''2, max02_experion "' –

0

당신의 Job 클래스처럼 보이는 경우 이 :

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

    public string JobName { get; set; } 
} 

그것을

public class JobComparer : IComparer<Job> 
{ 
    public int Compare(Job x, Job y) 
    { 
     if (x.FolderId != y.FolderId) return x.FolderId.CompareTo(y.FolderId); 

     return x.JobName.CompareTo(y.JobName); 
    } 
} 

을 사용 : : 그런 다음 IComparer<T>을 구현

enter image description here

2

당신이 올바른 위치 :

var orderedList = items.OrderBy(x => x, new JobComparer()).ToList(); 

이 예상되는 result.Here가 LINQPad의 출력 주어야한다 어떻게 정렬을하는지, 정렬 된 컬렉션을 얻으려면 변수에 할당해야합니다 :

을 참조하십시오.NET 바이올린 : http://dotnetfiddle.net/wISQVv

이 그것이 무엇을 본질적으로 :

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

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