如何播放列表中以前播放过的歌曲?

时间:2020-01-19 18:14:56

标签: c# shuffle

我在音乐播放器中使用了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();
        }

我在互联网上找不到任何相关信息,有人知道该怎么做吗? 谢谢

1 个答案:

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

别忘了检查边界!

相关问题