【问题标题】:How to play previously played songs in a list?如何在列表中播放以前播放的歌曲?
【发布时间】: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,则随机选择你的下一首歌曲,如果是的话;将其添加到列表中。别的;在该索引处播放列表中提到的歌曲。现在前进和后退可以用一个函数来固定。

标签: c# shuffle


【解决方案1】:

没有必要颠倒列表。添加一个bool,如:PlayForward,如果为真则索引将增加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();
         }
    }
}

不要忘记检查边界!

【讨论】:

    猜你喜欢
    • 2012-05-15
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2015-10-12
    相关资源
    最近更新 更多