我在音乐播放器中使用了Fisher-Yates随机播放功能,但是当您播放上一首歌曲时,它也是列表中的随机歌曲。因此,我添加了一个列表,用于保存播放的歌曲PlayedSongs
。它会记住所有播放过的歌曲。如何来回播放这些歌曲?如果我退回三首歌,然后再继续前进,那仍然是第二首歌。但是考虑这种算法让我头疼,我做对了。这就是我所拥有的。
同样要弄清楚:我想要一个可以前后播放的随机播放。向后播放时,所有歌曲都必须按顺序最近播放。 (这是临时的,因此此列表会在退出时清除)。
此if语句来自正常播放歌曲并检查是否启用随机播放的另一种方法:
//after song was played
if (ShuffleIsOn)
{
ShuffledSongIndexes.Remove(ShuffledSongIndexes.FirstOrDefault());
PlayedSongs.Add(song);
}
然后:
public List<Song> PlayedSongs = new List<Song>();
public int CurrentShuffleIndex = 0;
public void PlayPreviousSongs()
{
PlayedSongs.Reverse();
CurrentShuffleIndex++;
try
{
MediaElement.Source = new Uri(PlayedSongs[CurrentShuffleIndex].FullFileName);
}
catch (ArgumentOutOfRangeException)
{
MediaElement.Source = new Uri(PlayedSongs[CurrentShuffleIndex - 1].FullFileName);
}
MediaElement.Play();
PlayedSongs.Reverse();
}
public void PlayNextSongs()
{
CurrentShuffleIndex++;
MediaElement.Source = new Uri(PlayedSongs[CurrentShuffleIndex].FullFileName);
MediaElement.Play();
}
我在互联网上找不到任何相关信息,有人知道该怎么做吗? 谢谢
答案 0 :(得分:1)
无需反转列表。添加一个布尔值:PlayForward,如果为true,则索引将增加1,否则将减少1,例如:
CurrentIndex += (PlayForward ? 1 : -1)
此外,还有一种方法可以使您的生活更轻松。每当您更改索引时,请勿更改歌曲。相反,请像这样组合流程:
int _CurrentIndex;
public int CurrentIndex
{
get => _CurrentIndex;
set
{
if (value != _CurrentIndex)
{
_CurrentIndex = value;
MediaElement.Source = new Uri(PlayedSongs[CurrentIndex].FullFileName);
MediaElement.Play();
}
}
}
别忘了检查边界!