2012-05-28 6 views
-3

Ian Griffiths가 C#에서 만든이 자연 정렬 클래스를 보았습니다 (http://www.interact-sw.co.uk/iangblog/2007/12/13/natural-sorting).내 코드에서이 클래스를 사용하는 방법

내 코드의 개체 목록을 개체 이름별로 정렬하려면 (객체의 필드로 어떻게 처리 할 것인가) 어떻게 사용합니까? 오류를 내놓았다

내가 시도 ...

System.Func<MyObjectClass, string> ConvertMyObject = str => 
    { 
     return str.ToString(); 
    }; 
    listObjects = listObjects.OrderBy(str => Regex.Split(str, "([0-9]+)").Select(ConvertMyObject), new EnumerableComparer<MyObjectClass>()); 

감사합니다!

/// <summary> 
/// Compares two sequences. 
/// </summary> 
/// <typeparam name="T">Type of item in the sequences.</typeparam> 
/// <remarks> 
/// Compares elements from the two input sequences in turn. If we 
/// run out of list before finding unequal elements, then the shorter 
/// list is deemed to be the lesser list. 
/// </remarks> 
public class EnumerableComparer<T> : IComparer<IEnumerable<T>> 
{ 
/// <summary> 
/// Create a sequence comparer using the default comparer for T. 
/// </summary> 
public EnumerableComparer() 
{ 
    comp = Comparer<T>.Default; 
} 

/// <summary> 
/// Create a sequence comparer, using the specified item comparer 
/// for T. 
/// </summary> 
/// <param name="comparer">Comparer for comparing each pair of 
/// items from the sequences.</param> 
public EnumerableComparer(IComparer<T> comparer) 
{ 
    comp = comparer; 
} 

/// <summary> 
/// Object used for comparing each element. 
/// </summary> 
private IComparer<T> comp; 


/// <summary> 
/// Compare two sequences of T. 
/// </summary> 
/// <param name="x">First sequence.</param> 
/// <param name="y">Second sequence.</param> 
public int Compare(IEnumerable<T> x, IEnumerable<T> y) 
{ 
    using (IEnumerator<T> leftIt = x.GetEnumerator()) 
    using (IEnumerator<T> rightIt = y.GetEnumerator()) 
    { 
     while (true) 
     { 
      bool left = leftIt.MoveNext(); 
      bool right = rightIt.MoveNext(); 

      if (!(left || right)) return 0; 

      if (!left) return -1; 
      if (!right) return 1; 

      int itemResult = comp.Compare(leftIt.Current, rightIt.Current); 
      if (itemResult != 0) return itemResult; 
     } 
    } 
} 
} 
+1

StackOverflow에 오신 것을 환영합니다. 지금까지 당신을 위해 일하지 않은 것은 무엇입니까? 네가 묻는 것은 정확히 무엇인가? 귀하의 게시물이 "나는이 코드를 가지고 있는데, 어떻게 사용합니까?"라는 메시지가 나타납니다.이 경우 적절한 질문이 아닙니다. 우리는 튜토리얼 사이트가 아닙니다. 구체적인 질문이 있으시면 저희에게 도움을 요청하십시오. 감사. :-) –

+0

대신이 코드 작성자에게 묻지 않습니까? – zerkms

+0

감사합니다. 나는 "튜토리얼"그 자체를 묻지 않았습니다. 그래서 내가 시도한 것은 Enumerable test = new Enumerable (); listObjects.Sort (test.Compare()); // List listObjects – user1420850

답변

0

그가 제공하는 자연 정렬 방법은 '정상'정렬이 필요한 것을 준수하지 않을 때 정말 유용합니다. 예를 들어 문자열을 정렬하는 '일반적인'방법은 알파벳 순서이므로 해결 방법이 필요합니다.

그러나 예제에서는 사용자 지정 개체를 정렬하려고합니다. 즉, 사용자 지정 정렬 규칙을 제공해야합니다.

이러한 규칙을 정의하려면 개체에서 선택한 필드를 기반으로 자신의 비교를 사용하십시오.

설명 된 '이름'입력란에 먼저 정렬을 정렬 할 수 있으며, 일치하는 경우 숫자 입력란을 비교할 수 있습니다.

그러나 주어진 필드에 자연 정렬이 필요하다면 블로그의 편리한 EnumerableComparer를 이해하기 쉽게 기술을 적용 할 수 있습니다. (오른쪽에 선택()).

마지막으로 LINQ 표현식이면 (예 : 왼쪽에있는 Regex.Split (str.Replace ("", "") 그것은 당신에게 힘든 시간을주고있어, check out this LINQ-less approach.

+0

설명과 (인내심) 주셔서 감사합니다. 내가 제안한 것을보고 직접 해결해 보겠습니다. – user1420850

관련 문제