C# 为音乐播放器项目制作最常播放的部分(数组排序并将数组传递给列表)

C# Making a Most Played section for a music player project (Array sort and passing the array to a list)

我正在尝试用 C# 制作一个音乐播放器程序。我目前做的项目是个人使用的,不会在public发表。 向你们展示我到目前为止所做的是:

UI:

这是程序的UI,左边有两个按钮My Music & Favorites(应该是播放次数最多的歌曲)。我需要帮助的是将列表项目从最大到最小排序,这意味着所有播放次数最多的项目必须排在列表的第一位(数据存储在 txt 文件中,信息在“尝试过的内容”部分提供)而且我不确定如何使用列表来做到这一点。忽略右下角的windows媒体播放器控件,我用它来播放音乐文件并在程序启动时隐藏。

我有一个列表框控件,里面有不同的歌曲,每次从列表中单击一个项目时,都会播放所选项目。我目前正在将每首歌曲的数据保存在一个 .txt 文件中。此外,当单击“收藏夹”按钮时,程序会清除当前列表(它不会打开新表单)并添加文件夹中的数据(如果歌曲之前从未播放过,则不会生成 .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]);
}

我希望数组项按从大到小的顺序排序,但事实并非如此,因为列表是随机排序的。

不要使用二维数组。制作一个 class 来保存数据并制作一个数组:

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();
}