【问题标题】:C# - Sorting a ListBox by the endingC# - 按结尾对 ListBox 进行排序
【发布时间】:2011-07-26 16:10:06
【问题描述】:

我有一个 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 进行排序...所以 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* 结尾,R21 将被放置在C25 之上,因为它在第 6 列之后检查了第 2 列(这是从小到大排序的)。

所以,新文件如下所示:

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 位于SOT236 之前,因为它在上述排序列表中的编号为3216 而不是TANT


问题:

  • 如何使用 6th 列(如果需要,使用 2nd 列)对第一个文件进行正确排序,使其看起来像第二个文件?
  • 我可以使用正则表达式还是有更简单的方法?
  • 我有 3 个列表框,这 1 个需要使用上面的规则(结尾)进行排序,第二个列表框使用单独的规则,第三个列表框对未进入第一个或第二个列表框的任何其他内容进行排序。所以第一个和第二个 ListBox 是相似的,那么对于第三个 ListBox,我怎么能按其结尾按字母顺序排序?

【问题讨论】:

  • 您的 TANT3216 / SOT236 示例仍不清楚,3216 在 216 之后。
  • 数据从哪里来?在将其放入列表框之前进行排序可能会更容易,您可能最终会编写自定义排序例程,因为数据不是传统的 a-z 类型顺序。
  • @Henk:如果你看一下结尾的顺序,没有 216,所以它是基于 SOT 的,它是顺序列表中的最后一项。但是,对于 3216,订单结尾列表中有一个匹配项,所以它抓住了,因为没有一个用于 TANT.. 这更清楚吗?
  • @Stuart:它来自一个文本文件并被放入一个 RichTextBox,然后移动到一个 ListBox 用于用户功能。我在想我可以在将它放入 ListBox 之前在 RichTextBox 中对其进行排序,但我仍然不知道该怎么做。

标签: c# regex sorting listbox alphabetical


【解决方案1】:

第一步:

为您的列创建一个具有属性的类。也许你已经有了,还不清楚。否则你就得拆线了。

第 2 步:

创建一个使用 OrderBy(x=> x.Col6Property).ThenBy(x=>x.Col2Property) 的 LINQ 查询

第 3 步:

将对象列表添加到您的列表框中,并使用重写的 ToString() 或 ListBox.Format 来获得您想要的输出。

【讨论】:

  • 我没有具有列属性的类。我对 LINQ 也不熟悉...您可以给我更多建议或帮助吗? :)
  • 你必须开设这样的课程。任何基于文本的尝试都注定失败。
【解决方案2】:

您应该通过为您正在处理的类型实现 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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    • 1970-01-01
    • 2017-10-29
    • 2018-07-25
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    相关资源
    最近更新 更多