【发布时间】:2020-01-19 18:14:56
【问题描述】:
我的音乐播放器使用 Fisher–Yates shuffle,但是当您播放上一首歌曲时,它也是列表中的一首随机歌曲。所以,我添加了一个列表来保存播放的歌曲PlayedSongs。它会记住所有播放过的歌曲。我如何来回播放这些歌曲?如果我将返回 3 首歌曲,然后再向前,它仍然是第 2 首歌曲。但是想到这个算法让我很头疼,我不能正确。这就是我所拥有的。
再次明确:我想要一个可以向前和向后播放的洗牌。向后播放时,所有歌曲必须最近按顺序播放。 (这是临时的,所以这个列表在退出时会被清除)。
这个 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();
}
我在互联网上没有找到任何关于此的内容,有谁知道如何做到这一点? 谢谢
【问题讨论】:
-
你试过用 LinkedList 来播放 PlayedSongs 吗?它具有可能对您有所帮助的 Next 和 Previous 方法
-
只需将播放的歌曲放在一个列表中并跟踪索引。你需要一年的时间才能解决记忆问题;-)
-
@feihoa 我对 LinkedList 不熟悉,所以我现在就尝试一下,它看起来很有希望。感谢您的回复
-
@Stefan 听起来确实是最好的方法。但正如你所见,我尝试使用索引,但我可能想多了。这就是让我头疼的地方,所有的索引。我希望我能找到办法。
-
我认为使用反向会使它更复杂。从
0开始,如果你的当前索引高于列表中的项目-1,则随机选择你的下一首歌曲,如果是的话;将其添加到列表中。别的;在该索引处播放列表中提到的歌曲。现在前进和后退可以用一个函数来固定。