public List <string> getSongs(int numberOfSongs, EmotionSpaceDTO emotionSpaceDTO) { Dictionary <string, EmotionSpaceDTO> songs = new Dictionary <string, EmotionSpaceDTO>(); Action <SQLiteDataReader> addSongsToDict = (rdr) => { while (rdr.Read()) { EmotionSpaceDTO point = new EmotionSpaceDTO(); point.Energy = rdr.GetDouble(1); point.Positivity = rdr.GetDouble(2); songs[rdr.GetString(0)] = point; } }; getAllSongs(addSongsToDict); if (songs.Count < numberOfSongs) { numberOfSongs = songs.Count; } List <SongDistance> closeSongs = new List <SongDistance>(numberOfSongs); double farPoint = double.MinValue; foreach (KeyValuePair <string, EmotionSpaceDTO> kvp in songs) { SongDistance val = new SongDistance(); val.distance = getDistance(emotionSpaceDTO, kvp.Value); val.song = kvp.Key; if (closeSongs.Count < numberOfSongs) { closeSongs.Add(val); if (farPoint < val.distance) { farPoint = val.distance; } } else { if (val.distance < farPoint) { closeSongs.Add(val); closeSongs.Sort(compareDistance); closeSongs.RemoveAt(closeSongs.Count - 1); } } } List <string> ret = new List <string>(); foreach (SongDistance finalVal in closeSongs) { ret.Add(finalVal.song); } return(ret); }
private int compareDistance(SongDistance a, SongDistance b) { return(a.distance.CompareTo(b.distance)); }