2011-07-26 4 views
0

でListBoxコントロールを並べ替え、私は以下のようないくつかのデータが含まれているリストボックスがあります。私は、文字列に終了することにより、リストボックスをソートしたい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 *を参照)、リスト項目は2nd列でソートされます。したがって、R21で始まる行がC25で始まる行の後に来て、それらが両方とも* 0402_3 *で終わっていても、C25の上に配置されます(第2列が第6列の後でチェックされるためです) )。

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 
...  .......... ....... ....... ... ........ 

それは上記の順序リストにTANT ない数のオフに起こっているのでTANT3216SOT236前に来るのお知らせ。


質問:

  • どのように私はきちんと第六列(および第二列を必要に応じて)を使用して、第2のファイルのように見えるために最初のファイルを並べ替えることができます?
  • Regexを使うことができますか、それとも簡単な方法がありますか?
  • 私は3つのリストボックスを持っています.1つは上記のルール(エンディング)を使ってソートする必要があり、2番目のリストボックスは別のルールを使い、3番目のリストボックスは1番目または2番目のリストボックスに入っていないものを並べ替えます。だから1番目と2番目のリストボックスは似ているので、どのように終わりで何かを並べ替えることができる3番目のリストボックスのアルファベット順は
+0

あなたのTANT3216/SOT236の例はまだ不明である、3216はデータがから来ている216 –

+0

の後に来ますか?リストボックスに入れる前にソートするほうが簡単かもしれませんが、データが従来のa-z型の順序ではないので、おそらくカスタムソートルーチンを書くことになります。 – Stuart

+0

@Henk:エンディングの順番を見ると、216はないので、注文リストの最後の項目である** 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 
} 
関連する問題