C # Создание раздела «Самые популярные» для проекта музыкального проигрывателя (сортировка массива и передача массива в список) - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь создать программу Music Player на C #.Проект, которым я сейчас занимаюсь, предназначен для личного использования и не будет опубликован.Ребята, я покажу вам, что я сделал до сих пор:

Пользовательский интерфейс: enter image description here

Это пользовательский интерфейс программы, слева есть двакнопки «Моя музыка и избранное» (которая должна быть самой популярной).Мне нужна помощь в сортировке элементов списка от самого большого до наименьшего, что означает, что наиболее часто воспроизводимый из них должен быть первым в списке (данные хранятся в текстовом файле, информация представлена ​​в разделе «что пытались»).и я не уверен, как это сделать с помощью списка.Игнорируйте элемент управления Windows Media Player в правом нижнем углу, я использую его для воспроизведения музыкальных файлов и скрытия при запуске программы.

У меня есть элемент управления списком, в котором есть разные песни, каждый раз, когда элемент выбирается из списка, воспроизводится выбранный элемент.В настоящее время я сохраняю данные каждой песни в текстовом файле.Также при нажатии кнопки «Избранное» программа очищает текущий список (она не открывает новую форму) и добавляет данные из папки (если песня никогда не воспроизводилась до того, как у нее не будет сгенерирован файл .txt, поэтомуне будет добавлено).Мне удалось перечислить самые популярные песни в списке.Таким образом, у меня есть файл .txt для каждой песни, в котором указано, сколько раз песня была воспроизведена в первой строке.

Кроме того, я попытался создать массив двухмерных строк, который имеет 2 столбца, название песни.первое и количество пьес как второе.Я пытался отсортировать массив, но результаты не сортировались, когда я пытался добавить элементы массива в список.

//This is my sort class:

string[,] _sortArray;
int[] _tagArray;
int _sortIndex;

protected string[,] SortArray { get { return _sortArray; } }

public ArraySort(string[,] theArray, int sortIndex)
{
    _sortArray = theArray;
    _tagArray = new int[_sortArray.GetLength(0)];
    for (int i = 0; i < _sortArray.GetLength(0); ++i) _tagArray[i] = i;
    _sortIndex = sortIndex;
}

public string[,] ToSortedArray()
{
    Array.Sort(_tagArray, this);
    string[,] result = new string[
    _sortArray.GetLength(0), _sortArray.GetLength(1)];
    for (int i = 0; i < _sortArray.GetLength(0); i++)
    {
        for (int j = 0; j < _sortArray.GetLength(1); j++)
        {
            result[i, j] = _sortArray[_tagArray[i], j];
        }
    }
    return result;
}

public virtual int Compare(int x, int y)
{
        if (_sortIndex < 0) return 0;
        return CompareStrings(x, y, _sortIndex);
}

protected int CompareStrings(int x, int y, int col)
{
        return _sortArray[x, col].CompareTo(_sortArray[y, col]);
}

//Calling the method from the main program and storing the array data to the 
//list
ArraySort comparer = new ArraySort(array, 1);
string[,] sortedData = comparer.ToSortedArray();
for (i = 0; i < sortedData.GetLength(0); i++)
{
    listSongs.Items.Add(sortedData[i,0]);
}

Я ожидал, что элементы массива будут отсортированы от самого большого до самого маленького, но этопохоже, это не так, поскольку список отсортирован случайным образом.

1 Ответ

0 голосов
/ 07 февраля 2019

Не используйте 2D-массив.Создайте класс для хранения данных и создайте массив этого:

class SongPlayData {
    string SongName;
    int PlayCount;
}

// ...

SongPlayData[] playData = // your song data here

Затем вы можете отсортировать массив следующим образом:

SongPlayData[] ToSortedArray() {
    var sortedData = SongPlayData[playData.length];
    Array.Copy(playData, sortedData, 0);
    Array.Sort(sortedData, (a, b) => a.PlayCount.CompareTo(b.PlayCount));
    return sortedData;
}

И вот обязательная версия LINQ:

SongPlayData[] ToSortedArray() {
    return playData.OrderBy(d => d.PlayCount).ToArray();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...