2012-09-21 6 views
3

Office가 클래스 인 경우 이있는 국가를 국가별로 정렬해야합니다 (국가는 Office 클래스의 속성 임).특정 조건에 따라 목록 끝에있는 목록 항목을 효율적으로 이동하는 방법

일부 사무실에는 국가가 없으므로 목록 상단에 표시됩니다. 이 경우에는 "덜 관련성이있는"것으로 간주되어 이후에 목록의 맨 아래에 넣어야합니다.

switch (sortOptions.SortField) 

... 

case OfficeSortField.Country: 

var noCountryList = officesList.Where(a => string.IsNullOrEmpty(a.CountryText)).ToList(); 
officesList.RemoveAll(a => string.IsNullOrEmpty(a.CountryText)); 

officesList= sortOptions.SortOrder == SortOrder.Ascending 
             ? officesList.OrderBy(o => o.CountryText).ToList() 
             : officesList.OrderByDescending(o => o.CountryText).ToList(); 

officesList.AddRange(noCountryAssoList); 
break; 

퍼포먼스 관점에서 볼 때 더 나은 방법이 있습니까?

+0

어떤 언어입니까? 대부분의 경우 사용자 정의 기준으로 정렬 할 수있는'sort' 함수가 있습니다. –

+0

C#입니다. 태그로 추가했습니다. – Francesco

+0

비슷하고 좋은 답변. 필자의 경우 목록 끝에있는 이동은 아주 특정한 경우에만 필요합니다 (이것은 Telerick Grid의 많은 종류 중 하나 일뿐입니다). 내가 제안한 코드만큼 성능이 좋고 우아하지는 않지만 완벽을 기하기 위해 코드를 게시합니다. – Francesco

답변

2

이를위한 가장 좋은 방법은이 기술 자료 문서에서 자세한 내용을 찾을 수있는 comparer :

당신의 비교 자에
class OfficeComparer:IComparer<Office> 
{ 
     int IComparer.Compare(Office a, Office b) 
     { 
       if (a.Office.Country != null && b.Office.Country != null) 
         return a.Office.Country.CompareTo(b.Office.Country); 
       if (a.Office.Country == null && b.Office.Country != null) return -1; 
       if (a.Office.Country != null && b.Office.Country == null) return 1; 
       return 0; // if both have no country, return equal or whatever other criteria comparaison 

     } 
} 

, 당신은 그냥없이 사무실에 낮은 우선 순위를 부여

List<Office> lst = FillList(); 

lst.sort(new OfficeComparer()); 
-1

Java에서는 Comparable<T> 인터페이스를 구현 한 다음 java.util.Collections.sort(List<T> list)을 호출하여 목록을 정렬 할 수 있습니다.

public class Office implements Comparable<Office> { 
    private String country; 
    public int compareTo(Office off) { 
    if (this.country == null) 
     return -1; 
    else if (off.country == null) 
     return 1; 
    else 
     return this.country.compareTo(off.country); 
    } 
} 

정렬 목록 :

java.util.Collections.sort(yourOfficeList); 
+0

질문에 C# 태그가 붙어 있습니다. – AgentFire

+0

좋아, 내 게시물을 무시하십시오. 그러나 C#에서 비슷한 점이 있기를 바랍니다. –

+0

물론입니다. Java는 C#과 같습니다 :) – AgentFire

2

성능 차이는 걱정의 가치가 너무 작은 것 일의이 종류에 대해 알 것

세부 사항을 참조하십시오. 당신이 이미 그렇게하지 않는다면, Linq을 사용하여 원하는대로 정렬 할 수있는 로직을 수행 할 것이므로 제거/삽입 할 필요가 없습니다.

그런 다음 성능을 향상 시키려면 Plinq를 사용하여 여러 코어에 로직을 분산 시키십시오.

+0

내 경우에는 Plinq의 필요성을 요구하는 요소가 너무 많지 않을 것입니다. 그러나 좋은 점을 생각하면 미래의 경우 +1! – Francesco

2

가장 좋은 방법은 맞춤 함수를 사용하여 정렬하는 것입니다.

당신은 대리인으로 작업을 수행 할 수 있습니다

list.Sort((first, second) => 
     { 
     // Your code to compare first and second items 
     // return 0 if equal, -1 or +1 for other cases 
     }); 

당신은 한 번에 모든 과정을 할 수있는, 당신은 나라없이 사무실을 추출 할 필요가 없습니다.

2

물론 있습니다. 이것을 시도해보십시오 :

또는 정렬 작업을 다시 사용하려는 경우에는 비교기를 구현하는 것이 좋습니다.

class OfficeComparer : IComparer<Office> 
{ 
    public int Compare(Office a, Office b) 
    { 
     return a.Country == null ? (b.Country == null ? 0 : -1) : 
      (b.Country == null ? 1 : Comparer<Office>.Default.Compare(a, b)) 
    } 
} 

그럼 당신은 그것을 사용할 수 있습니다

List<Office> list = new List<Office>(...); 
list.Sort(new OfficeComparer()); 
0

이 가장 쉽고 성능 효과, 나는 모든 검색 : 국가를 누른 다음 바로 정렬 메소드를 호출 나는 물리학 서적에서 "다른"카테고리를 목록의 끝 부분에 나열하도록하고 싶다.

List<Books> controlGroupDetails = controlDetails.Where(s => s.Title == "Physics").ToList(); 
var otherPhysics = controlDetails.Where(s => s.Title == "Physics" && s.Name == "Other").SingleOrDefault(); 
controlGroupDetails.Remove(otherPhysics); 
controlGroupDetails.Insert(controlGroupDetails.Count(), otherPhysics); 
관련 문제