Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C为音乐播放器项目制作播放次数最多的部分(数组排序并将数组传递给列表)_C#_Listbox_Audio Player - Fatal编程技术网

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

C# C为音乐播放器项目制作播放次数最多的部分(数组排序并将数组传递给列表),c#,listbox,audio-player,C#,Listbox,Audio Player,我正在尝试用C语言制作一个音乐播放器程序。我目前正在做的项目是供个人使用的,不会公开发表。 向大家展示我迄今为止所做的工作: 用户界面: 这是程序的用户界面,左边有两个按钮“我的音乐和收藏夹”,这应该是播放次数最多的歌曲。我需要帮助的是从最大到最小对列表项进行排序,这意味着所有列表项中播放最多的必须是存储在txt文件中的列表数据,在What's Twest部分中提供的信息,我不确定如何使用列表进行排序。忽略右下角的windows media player控件,我使用它播放音乐文件并在程序启动时隐

我正在尝试用C语言制作一个音乐播放器程序。我目前正在做的项目是供个人使用的,不会公开发表。 向大家展示我迄今为止所做的工作:

用户界面:

这是程序的用户界面,左边有两个按钮“我的音乐和收藏夹”,这应该是播放次数最多的歌曲。我需要帮助的是从最大到最小对列表项进行排序,这意味着所有列表项中播放最多的必须是存储在txt文件中的列表数据,在What's Twest部分中提供的信息,我不确定如何使用列表进行排序。忽略右下角的windows media player控件,我使用它播放音乐文件并在程序启动时隐藏

我有一个listbox控件,其中包含不同的歌曲,每次从列表中单击一个项目时,都会播放选定的项目。我目前正在将每首歌曲的数据保存在一个.txt文件中。此外,当单击“收藏夹”按钮时,程序会清除当前列表,但不会打开新表单,并从文件夹中添加数据,如果歌曲以前从未播放过,则不会生成.txt文件,因此不会添加。我设法列出了列表中播放次数最多的歌曲。因此,我为每首歌曲都有一个.txt文件,其中包含第一行播放歌曲的次数

除此之外,我还尝试制作一个2D字符串数组,该数组有两列,歌曲名称第一,播放次数第二。我已尝试对数组进行排序,但在尝试将数组项添加到列表时,结果未排序

//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]);
}

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

不要使用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();
}

使用2D字符串数组而不创建模型类是否有特定原因。。。也许是一份清单?您是否考虑过使用LINQ来简化排序需求?我只是想知道我是否缺少一些要求。我无法使用LINQ,因为我试图将2d数组中的某个列与字符串值进行比较,我知道该列始终有播放歌曲的次数,我必须将数组设置为字符串类型,因为我想知道下一列中歌曲的名称。下面我将尝试你和@Abion47的想法,将数据保存到类而不是数组中。非常有趣,这并不完全是我需要的,但我将把数据保存到类而不是数组中。谢谢你的帮助!