С# — сортировка ListBox по окончанию

У меня есть 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, потому что второй столбец проверяется после шестого столбца (он отсортирован от наименьшего к наибольшему). ).

ТАК, новый файл будет выглядеть так:

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)?
  • Могу ли я использовать Regex или есть более простой способ?
  • У меня есть 3 ListBox, этот 1 должен быть отсортирован с использованием правил (окончаний) выше, 2-й ListBox использует отдельные правила, а 3-й ListBox сортирует все остальное, что не вошло в 1-й или 2-й ListBox. Итак, 1-й и 2-й ListBox похожи, так как же я могу сортировать что-либо по его окончаниям в алфавитном порядке для 3-го ListBox?

person theNoobGuy    schedule 26.07.2011    source источник
comment
Ваш пример с TANT3216/SOT236 пока не ясен, 3216 идет после 216.   -  person Henk Holterman    schedule 26.07.2011
comment
откуда данные? вероятно, было бы проще отсортировать, прежде чем помещать его в список, вы, вероятно, в конечном итоге напишете собственную процедуру сортировки, поскольку данные не находятся в традиционном порядке типов az.   -  person Stuart    schedule 26.07.2011
comment
@Henk: Если вы посмотрите на порядок окончаний, 216 нет, поэтому он основан на SOT, который является последним элементом в списке порядка. Однако для 3216 в списке окончаний порядков есть совпадение, поэтому он улавливает это, поскольку для TANT нет ни одного... так понятнее?   -  person theNoobGuy    schedule 26.07.2011
comment
@Stuart: он исходит из текстового файла и помещается в RichTextBox, а затем перемещается в ListBox для пользовательских функций. Я думал, что смогу отсортировать его в RichTextBox, прежде чем он будет помещен в ListBox, но я до сих пор не знаю, как это сделать.   -  person theNoobGuy    schedule 26.07.2011


Ответы (2)


Шаг 1:

Создайте класс со свойствами для ваших столбцов. Может у вас это уже есть, не понятно. В противном случае вам придется разрывать струны.

Шаг 2:

Создайте запрос LINQ, который использует OrderBy(x=> x.Col6Property).ThenBy(x=>x.Col2Property)

Шаг 3:

Добавьте список объектов в свой список и используйте переопределенный ToString() или ListBox.Format, чтобы получить желаемый результат.

person Henk Holterman    schedule 26.07.2011
comment
У меня нет класса со свойствами моих столбцов. Я также не знаком с LINQ... Есть еще предложения или помощь, которые вы можете мне дать? :) - person theNoobGuy; 26.07.2011
comment
Вам придется сделать такой класс. Любая попытка сделать это на основе текста обречена. - person Henk Holterman; 26.07.2011

Вы должны сделать это, реализовав интерфейс 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
}
person Ryan Gross    schedule 26.07.2011