C# sortedList shuffle

本文关键字:shuffle sortedList | 更新日期: 2023-09-27 18:17:49

我对c#相当陌生,并试图创建一个mp3播放器。我使用sortedList作为播放列表(歌曲名称为Key,文件路径为Value),但我不确定如何随机化播放列表的顺序。

我试过这种方法,但是它没有产生任何新的顺序,它从列表中删除了一首歌,嘿。

private SortedList Shuffle(SortedList oldSongList)
{
    SortedList newSongList = new SortedList();
    Random r = new Random();
    int n = oldSongList.Count;
    while (n > 1)
    {
        int rand = r.Next(n);
        newSongList.Add(oldSongList.GetKey(rand), oldSongList.GetByIndex(rand));
        oldSongList.RemoveAt(rand);
        oldSongList.TrimToSize();
        n--;
    }
    return newSongList;
}

任何想法吗?

C# sortedList shuffle

一个SortedList正好是排序的。
你不能改变它的顺序。

相反,您应该将项目放入List<T>并对其进行洗牌。

使用List而不是SortedList是最好的设计,但是有一种方法可以使用SortedList。使用不做任何实际排序的IComparer来制作洗牌列表。这个IComparer将把每个新的添加添加到列表的开始或结束。我不确定是哪一种,因为我不知道SortedList的底层排序实现,但这无关紧要,因为任何一种方式都是可以接受的。

public class SuffleSorter : IComparer
{
      int IComparer.Compare( Object x, Object y )  {
          return -1;
      }
}

private SortedList Shuffle(SortedList oldSongList) 
{ 
    SortedList newSongList = new SortedList(new ShuffleSorter()); 
    Random r = new Random(); 
    oldSongList.TrimToSize();
    for (int n = oldSongList.Count; n > 0; n--) 
    { 
        int rand = r.Next(n); 
        newSongList.Add(oldSongList.GetKey(rand), oldSongList.GetByIndex(rand)); 
        oldSongList.RemoveAt(rand); 
        oldSongList.TrimToSize(); 
    } 
    return newSongList; 
} 

注意,这需要在用户关闭播放时创建一个新的、合理排序的播放列表(假设您的播放是切换模式,而不是单击"播放列表"按钮)。