Изменить алгоритм сортировки для работы со списками?

Итак, я пытаюсь выяснить, как изменить этот алгоритм сортировки целых чисел для работы с элементами данных (именами файлов) в алфавитном порядке в списке, но не знаю, как это сделать?

Я понимаю, как работает приведенный ниже алгоритм сортировки, и могу реализовать его с помощью целочисленного массива. Однако для listBox я не могу найти соответствующие примеры в сети.

public partial class MainWindow : Window
{

    Random rand = new Random();
    int numOfIntegers = 1000;
    int[] array;

    public MainWindow()
    {

        InitializeComponent();

        array = new int[numOfIntegers]; 

    }


    // sort a vector of type int using exchange sort
    public void ExchangeSort(int[] array)
    {
        int pass, i, n = array.Length;
        int temp;
        // make n-1 passes through the data 
        for (pass = 0; pass < n - 1; pass++)
        {
            // locate least of array[pass] ... array[n - 1]  
            // at array[pass] 
            for (i = pass + 1; i < n; i++)
            {
                if (array[i] < array[pass])
                {
                    temp = array[pass];
                    array[pass] = array[i];
                    array[i] = temp;
                }
            }
        }
    }

    private void Button_Click_2(object sender, RoutedEventArgs e)
    {
        ExchangeSort(array);
        listBox.Items.Clear();
        foreach (int i in array)
        {
            listBox.Items.Add(i);
        }
        MessageBox.Show("Done");

    }

person Daniel Xi    schedule 08.04.2013    source источник
comment
Возможно, дубликат stackoverflow.com/questions/3667088/   -  person gorgi93    schedule 08.04.2013
comment
ну как не работает. Потому что этот код написан правильно   -  person gorgi93    schedule 08.04.2013
comment
вы хотите отсортировать числа по алфавиту??   -  person sa_ddam213    schedule 08.04.2013
comment
Нет, элементы данных в списке, которые в основном являются именами файлов (строками).   -  person Daniel Xi    schedule 08.04.2013
comment
Например, я создаю список и добавляю в него следующие элементы: listBox.Items.Add(Hello); listBox.Items.Add(Стив); listBox.Items.Добавить(Джон); listBox.Items.Добавить(Джон);   -  person Daniel Xi    schedule 08.04.2013
comment
Почему бы просто не установить для свойства ListBox.Sorted значение True и позволить ему сделать всю работу за вас?   -  person Ken White    schedule 08.04.2013
comment
Коллекция ListBox.Items изначально поддерживает сортировку. Просто добавьте к свойству SortDescriptions, и все готово: msdn.microsoft.com/en-us/library/   -  person Mike Zboray    schedule 08.04.2013
comment
@KenWhite Я полагаю, что он использует WPF, а не WinForms, но в обеих средах элементы управления будут сортироваться за вас.   -  person Mike Zboray    schedule 08.04.2013


Ответы (2)


Вы можете попробовать LINQ:

public void sort(int[] array)
{
    array = array.OrderByDescending (a => a).ToArray();
}
person devilfish17    schedule 08.04.2013

Если я правильно понимаю, вы пытаетесь отсортировать строки. Для сравнения строк вы можете просто использовать метод String.CompareTo() или, если вам нужно больше вместо простого сравнения в большинстве случаев подойдет StringComparator class. .

Если вы решите сделать это таким образом, условие при сортировке будет примерно таким:

if (array[i].CompareTo(array[pass]) < 0)

И остальная часть кода, вероятно, останется примерно такой же, за исключением, конечно, замены int[] на String[].

При этом я предлагаю использовать List<String> и просто пропустить делать эту работу полностью вручную. Для справки см. List.Sort().

Чтобы быть более конкретным, вот пример, основанный на вашем коде того, что я имею в виду.

public partial class MainWindow : Window
{
    List<String> items;

    public MainWindow()
    {

        InitializeComponent();
        items = new List<String>(); 
        // Fill your list with whatever items you need
    }

    private void Button_Click_2(object sender, RoutedEventArgs e)
    {
        items.Sort();
        listBox.Items.Clear();
        foreach (String str in items)
        {
            listBox.Items.Add(str);
        }
        MessageBox.Show("Done");

    }
}
person Emma Gospodinova    schedule 08.04.2013
comment
Изменение строки if (array[i] < array[pass]) на if (array[i].CompareTo(array[pass]) < 0) в методе ExchangeSort(), а также замена int[] на String[] в соответствующих местах решит вашу проблему. Также вам нужно будет изменить int temp; на String temp; в методе сортировки. - person Emma Gospodinova; 08.04.2013
comment
Спасибо за это. Похоже, я забыл заменить int на строку. - person Daniel Xi; 08.04.2013