public TidalAlbumList RandomCopy() { var retVal = new TidalAlbumList() { State = ListState.random }; var copy = new TidalAlbumList(Name, this); var random = new Random(); while (copy.Count > 0) { if (copy.Count == 1) { retVal.AddAlbum(copy.GetAlbumAt(0)); copy.RemoveAlbum(0); } else { var index = random.Next(copy.Count); retVal.AddAlbum(copy.GetAlbumAt(index)); copy.RemoveAlbum(index); } } return(retVal); }
public TidalAlbumList RandomSublist(int size) { if (size > Count) { throw new ArgumentException("Size cannot exceed library size"); } var randomList = RandomCopy(); var retVal = new TidalAlbumList() { State = ListState.random }; var index = 0; while (retVal.Count < size) { //if retVal already contains an album with the potential artist, skip, size permitting var albumToAdd = randomList.GetAlbumAt(index); if (retVal.Any(a => a.Artist == albumToAdd.Artist)) { //see if we have enough room. var stillToAdd = size - retVal.Count; var sourceAlbumsLeft = randomList.Count - (index + 1); //just skip one. If it's that artist again, it was meant to be. if (stillToAdd <= sourceAlbumsLeft) { index++; albumToAdd = randomList.GetAlbumAt(index); } } retVal.AddAlbum(albumToAdd); index++; } return(retVal); }
static void Main(string[] args) { var masterList = new TidalAlbumList() { Name = "From file" }; using (StreamReader reader = new StreamReader("Data2.txt")){ var line = reader.ReadLine(); while (line != null) { var parts = line.Split('\t'); masterList.AddAlbum(new TidalAlbum(parts[0], parts[1], null)); line = reader.ReadLine(); } } var startNumber = 56; var availableCount = masterList.AvailableList().Count; using (StreamWriter writer = new StreamWriter("Playlist2.txt", false)) { while (availableCount > 16) { var playList = masterList.AvailableList().RandomSublist(16); var playListName = $"PL{startNumber++}"; playList.Name = playListName; playList.ForEach(ta => ta.PlayList = playListName); masterList.AssignPlaylist(playList, playListName); var outPut = playList.ToStringList(); outPut.ForEach(l => writer.WriteLine(l)); availableCount = masterList.AvailableList().Count; writer.WriteLine(); } } }