C # sortedList shuffle - PullRequest
       24

C # sortedList shuffle

0 голосов
/ 13 декабря 2011

Я довольно новичок в C # и пытаюсь создать mp3-плеер.Я использую sortedList для списка воспроизведения (название песни в качестве ключа и путь к файлу в качестве значения), но я не уверен, как можно рандомизировать порядок списка для случайного воспроизведения.

Я пробовал такой подход,но он не предлагает никакого нового порядка и удаляет одну песню из списка, хе.

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;
}

Есть мысли?

Ответы [ 2 ]

5 голосов
/ 13 декабря 2011

A SortedList - это то, что & mdash; отсортировано.
Вы не можете изменить его порядок.

Вместо этого вы должны положить предметы в List<T> и перемешать .

0 голосов
/ 13 декабря 2011

Лучше всего использовать 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; 
} 

Обратите внимание, что для этого потребуется создать новый, отсортированный по закону список воспроизведения, когда пользователь отключает режим воспроизведения в случайном порядке (при условии, что ваш режим воспроизведения в случайном порядке - это режим переключения, а не кнопка "перемешать список воспроизведения" одним нажатием).

...