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;
}
任何想法吗?
一个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;
}
注意,这需要在用户关闭播放时创建一个新的、合理排序的播放列表(假设您的播放是切换模式,而不是单击"播放列表"按钮)。