2011-07-26 3 views
0

하여 목록 상자를 정렬 나는이 다음과 같은 몇 가지 데이터가 포함 된 목록 상자 :C#을 - 종료

C44  EXCLUDES 237.910 193.469 0 0603_5 
C45  EXCLUDES 244.102 193.387 0 0603 
R47  EXCLUDES 226.935 179.519 90 0402_1 
C18  CAP-00129G 230.960 190.619 0 0402 
C17  CAP-00129G 250.085 198.569 180 0402_3 
Q7  IC-00268G 258.460 205.594 0 SOT236 
C25  CAP-00130G 255.635 189.669 90 0402_3 
C56  EXCLUDES 229.430 189.374 0 0402 
R42  EXCLUDES 241.010 192.194 90 TANT3216 
R21  CAP-00129G -123.370 -112.114 270 0402_3 
R10  EXCLUDES 246.560 203.894 0 0402_9 
...  .......... ....... ....... ... ........ 

나는이 (가)에서 문자열 ... 그래서 값을 끝으로 목록 상자를 정렬하고 싶습니다를 6th 열 (0603_5, 0603_5, 0402_2, 0402_4, 0402_3, TANT3216, 0402_9 ....). 또한,

RES, 0402, 0201, 0603, 0805, 1206, 1306, 1608, 3216, 2551, 1913, 1313, 2513, 5125, 2525, 5619, 3813, 1508, 6431, 2512, 1505, 2208, 1005, 1010, 2010, 0505, 0705, 1020, 1812, 2225, 5764, 4532, 1210, 0816, 0363, SOT.

:

이들 모두가 상기 파일의 예에 도시되어 있지 않지만


여기들은 (위에서 아래로) 표시되어야하는 순서이다 유사한 복수의 엔딩이있는 경우 (* 0402_3 * 위와 아래 참조), 목록 항목은 두 번째 열로 정렬됩니다. 따라서 R21으로 시작하는 줄이 C25으로 시작하는 줄 뒤에오고 둘 다 * 0402_3 *으로 끝나는 경우에도 C25 위에 놓이게됩니다. 왜냐하면 두 번째 열은 여섯 번째 열 다음에 검사되기 때문입니다 (이 열은 작은 것부터 큰 것으로 정렬됩니다).

SO, 새 파일은 다음과 같이 보일 것이다 :

C18  CAP-00129G 230.960 190.619 0 0402 
C56  EXCLUDES 229.430 189.374 0 0402 
R47  EXCLUDES 226.935 179.519 90 0402_1 
C17  CAP-00129G 250.085 198.569 180 0402_3 
R21  CAP-00129G -123.370 -112.114 270 0402_3 
C25  CAP-00130G 255.635 189.669 90 0402_3 
R10  EXCLUDES 246.560 203.894 0 0402_9 
C45  EXCLUDES 244.102 193.387 0 0603 
C44  EXCLUDES 237.910 193.469 0 0603_5 
R42  EXCLUDES 241.010 192.194 90 TANT3216 
Q7  IC-00268G 258.460 205.594 0 SOT236 
...  .......... ....... ....... ... ........ 

는 위의 주문 목록에 장교가 하지 수 떨어져 가고 있기 때문에 TANT3216SOT236 앞에 오는 공지 사항 .


질문 :

  • 합니다 (2 열을 필요한 경우) 내가 제대로 6 열을 사용하여 두 번째 파일과 같이 할 수있는 첫 번째 파일을 정렬 할 수있는 방법 ?
  • Regex를 사용할 수 있습니까? 아니면 더 간단한 방법이 있습니까?
  • 3 개의 ListBox가 있습니다.이 규칙은 위의 규칙 (끝)을 사용하여 정렬해야하며 두 번째 ListBox는 별도의 규칙을 사용하며 세 번째 ListBox는 첫 번째 또는 두 번째 ListBox에 들어 가지 않은 항목을 정렬합니다. 그래서 첫 번째와 두 번째 ListBoxes는 비슷합니다. 그래서 어쨌든 끝점으로 무엇이든 정렬하려면 어떻게해야합니까? 세 번째 ListBox는 알파벳순으로입니까?
+0

귀하의 TANT3216/SOT236 예는 아직 불분명하다 (3216)는 216 –

+0

경우 데이터에서오고 다음에 오는? 목록 상자에 넣기 전에 정렬하기가 더 쉬울 것입니다. 데이터가 전통적인 a-z 형식의 순서가 아니므로 사용자 정의 정렬 루틴을 작성하게 될 것입니다. – Stuart

+0

@Henk : 결말 순서를 보면, 아무 것도 없으므로 주문 목록의 마지막 항목 인 ** SOT **를 기반으로합니다. 그러나 3216에서는 주문 결말 목록에 일치 항목이 있으므로 ** TANT **에 대한 항목이 없기 때문에 그 내용을 파악할 수 있습니다. – theNoobGuy

답변

1

1 단계 :

것은 당신의 열의 속성을 가진 클래스를 만듭니다. 어쩌면 당신은 이미 그것을 가지고 있을지도 모르겠다. 그렇지 않으면 문자열을 끊어야합니다.

2 단계 : 얻을

이 (당신의 목록 상자에 개체의 목록을 추가하고 재정의 된 ToString을 사용) 또는 ListBox.Format :

OrderBy(x=> x.Col6Property).ThenBy(x=>x.Col2Property)

3 단계를 사용하는 LINQ 쿼리를 작성 원하는 출력.

+0

내 열 속성이있는 클래스가 없습니다. 나는 또한 * LINQ *에 익숙하지 않습니다. ... 더 이상 제안이나 도움을 줄 수 없습니까? :) – theNoobGuy

+0

그런 수업을해야 할 것입니다. 이 텍스트 기반 작업을 시도하면 운명에 처한다. –

1

처리 할 유형에 대한 IComparer 인터페이스를 구현하여이 작업을 수행해야합니다. 데이터가 모든 탭 문자열을 분리하는 경우, 당신은 사용할 수 있습니다 다음

public class DropBoxStringComparer : IComparer<string> 
{ 
    #region Implementation of IComparer<in string> 
    Col2StringComparer col2 = new Col2StringComparer(); 
    Col6StringComparer col6 = new Col6StringComparer(); 
    public int Compare(string x, string y) 
    { 
     char[] tab = new[]{(char) 9}; 
     string[] xParts = x.Split(tab); 
     string[] yParts = y.Split(tab); 
     var c6compare = col6.Compare(xParts[5], yParts[5]); 
     if (c6compare != 0) 
     { 
      return c6compare; 
     } 
     else 
     { 
      return col2.Compare(xParts[1], yParts[1]); 
     } 
    } 

    #endregion 
} 

public class Col6StringComparer : IComparer<string> 
{ 
    #region Implementation of IComparer<in string> 

    public int Compare(string x, string y) 
    { 
     //Rules that determine order of col 6 

    } 

    #endregion 
} 

public class Col2StringComparer : IComparer<string> 
{ 
    #region Implementation of IComparer<in string> 

    public int Compare(string x, string y) 
    { 
     //Rules that determine order of col 2 

    } 

    #endregion 
} 
관련 문제