0

以下のようなデータを含む ListBox があります。

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

文字列の末尾で ListBox をソートしたいので、6列目の値 (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* 参照)、リスト項目は2列目でソートされます。したがって、 で始まる行が で始まるR21行の後にC25あり、両方とも *0402_3* で終わる 場合でも、6 列目の後に 2 列目がチェックされるため (これは最小から最大にソートされます)、R21上に配置されます。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
...     ..........  .......  .......  ...  ........

TANT3216が前に来ることに注意してください。これは、上記の順序リストのTANTではなくSOT236、番号3216から外れているためです。


質問:

  • 6列目 (必要に応じて2列目)を使用して、最初のファイルを 2 番目のファイルのように正しく並べ替えるにはどうすればよいですか?
  • 正規表現を使用できますか、それとももっと簡単な方法がありますか?
  • 3 つの ListBox があります。この 1 つは上記のルール (エンディング) を使用して並べ替える必要があり、2 番目の ListBox は別のルールを使用し、3 番目の ListBox は 1 番目または 2 番目の ListBox に入らなかったものを並べ替えます。1 番目と 2 番目の ListBox は似ていますが、3 番目の ListBox の末尾をアルファベット順に並べ替えるにはどうすればよいでしょうか。
4

2 に答える 2

1

ステップ1:

列のプロパティを持つクラスを作成します。たぶんあなたはすでにそれを持っています、それは明らかではありません. そうしないと、文字列を分割する必要があります。

ステップ2:

を使用する LINQ クエリを作成します。OrderBy(x=> x.Col6Property).ThenBy(x=>x.Col2Property)

ステップ 3:

オブジェクトの List を Listbox に追加し、オーバーライドされた ToString() または ListBox.Format を使用して、必要な出力を取得します。

于 2011-07-26T16:19:18.007 に答える
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
}
于 2011-07-26T16:22:10.243 に答える