簡體   English   中英

將播放列表軌道分配給3D陣列

[英]Assign Playlist-Tracks to 3D Array

所以我在使用Spotify的API進行實驗時遇到了我遇到過的最復雜的問題。 我有流派文本文件,例如“ Chill”或“ House”。 在這些文件中,我具有指向Spotify播放列表的鏈接。 這些行的第一行代表我的這一類型的播放列表,例如:

myplalyist-ID 
random1-ID 
random2-ID ...

現在,由於這些鏈接指向播放列表,因此這些播放列表包含曲目。 現在,我想從那些隨機播放列表中獲取所有曲目,並將其放入我的曲目中(在這里過濾和添加曲目不是問題,只是為了您有所了解)。 現在我想我可以創建一個3D陣列來處理這些軌道,例如:

1D: genre1    - genre2    - genre3
2D: playlist1 - playlist2 - playlist3
3D: tracks1   - tracks2   - tracks3

希望您能理解我的意思,我希望能夠通過以下方式訪問播放列表軌道:

foreach(PlaylistTrack track in array[genre][playlist])
    // filter & add "track"

因此,我的處理方法如下:

//PlaylistTrack is the type in which Spotify stores a track within a Playlist
private List<PlaylistTrack>[,,] playlistTracks;//3D???
//this is to store the amount of playlists within a genre
private int[] playlistArray;
//int to save the amount of genre-files
private int fileCount;

//-----------------METHOD:

private void getTracks()
{
    DirectoryInfo dir = new DirectoryInfo(this.path);//directory where genres are stored

    this.fileCount = 0;

    foreach (var file in dir.GetFiles("*.txt"))
    {
        if (file.Name != "My Tracks.txt" && file.Name != "Tracks.txt")//getting all genre textfiles
        {
            this.fileCount++;
        }
    }

    this.playlistArray = new int[this.fileCount];

    //i know using the foreach over and over is kinda bad and not preofessional,
    //but i don't use c# on a daily base and i didn't knew how to get it done otherwise

    int count = 0;
    foreach (var file in dir.GetFiles("*.txt"))
    {
        if (file.Name != "My Tracks.txt" && file.Name != "Tracks.txt")
        {
            int count2 = 0;
            if (File.ReadAllText(file.FullName) != "")
            {
                using (StreamReader sr = new StreamReader(file.FullName))
                {
                    string line = "";
                    while ((line = sr.ReadLine()) != null)
                    {
                        if (line != "")
                        {
                            count2++;
                        }
                    }
                }

            }
            this.playlistArray[count] = count2;
            count++;
        }
    }

    for (int i = 0; i < this.fileCount; i++)
        this.playlistTracks[i] = new List<PlaylistTrack>[this.playlistArray[i]]();
    //here i'm stuck, how would i initialize the array, so it can holds a bunch of PlaylistTrack Items in "3rd row", 
    //accessable through [genre][playlist]
}

非常感謝您的幫助,因為我對此一無所知! :)

編輯:那就是我嘗試的:

//Setting File-Count to 0
this.fileCount = 0;

//Init new Dictionary
var allTracks = new Dictionary<string, Dictionary<string, List<PlaylistTrack>>>();

//Getting Directory where Genre-Files are
DirectoryInfo dir = new DirectoryInfo(this.path);

int count = 0;
//Looping through files in this Directory #1
foreach (var file in dir.GetFiles("*.txt"))
{
    //Get only Genre-Files, not Track-Lists
    if (file.Name != "My Tracks.txt" && file.Name != "Tracks.txt")
    {
        count++;
    }
}

//Init new string Array that will hold the Links to my Playlist for every genre
this.playlistLinks = new string[count];

//Looping through files in this Directory #2
foreach (var file in dir.GetFiles("*.txt"))
{
    //Get only Genre-Files, not Track-Lists
    if(file.Name != "My Tracks.txt" && file.Name != "Tracks.txt")
    {
        //If the Genre-File has content
        if (File.ReadAllText(file.FullName) != "")
        {
            //Getting the Genre Name, by splitting the Genre-File-Name
            string name = file.Name.Split(new string[] { ".txt" }, StringSplitOptions.None)[0];

            //Reading the Genre-File
            using (StreamReader sr = new StreamReader(file.FullName))
            {
                string line = "";
                bool first = false;
                //If the new line has content
                while ((line = sr.ReadLine()) != null)
                {
                    //If it's not the first line and the line is not ""
                    if (first && line != "")
                    {
                        //Splitting line to get Data
                        //split[0] = PlaylistID; split[1] = OwnerID
                        string[] split = line.Split(new string[] { " // " }, StringSplitOptions.None);
                        //Getting Playlist Tracks and storing them in the Dictionary
                        //HERE HAPPENS THE ERROR
                        allTracks[name][split[0]] = this.getPlaylistTracks(split[1], split[0]);

                        //Looping through the Playlist-Tracks within the Dictionary
                        foreach (PlaylistTrack tr in allTracks [name][split[0]])
                        {
                            //If the Track is on Spotify's Servers
                            if (!tr.IsLocal)
                            {
                                //Filtering (not important here -> does work)
                                if (tr.AddedAt > time)
                                {
                                    //Creating a string that holds Track's info
                                    string write = tr.Track.Name + " // " + string.Join(",", tr.Track.Artists.Select(source => source.Name));
                                    //Filtering tracks that i haven't listened to, by checking if track exists in "My Tracks.txt"
                                    //(not important here -> does work)
                                    if (!this.foundTrack(write))
                                    {
                                        //Adding collected Tracks to another List, sorted by Genre
                                        //So all filtered Tracks from all Playlists within a genre are stored in one list
                                        this.tracksToAdd[this.fileCount].Add(tr);
                                    }
                                }
                            }
                        }
                    }
                    //If it's the first line where the line is not ""
                    if(!first && line != "")
                    {
                        string[] split = line.Split(new string[] { " // " }, StringSplitOptions.None);
                        //Getting the PlaylistID of my Playlist
                        this.playlistLinks[this.fileCount] = split[0];
                        first = true;
                    }
                }
            }
        }
        //Increasing on every new Genre-File
        this.fileCount++;
    }
}

錯誤發生,我在代碼中標記了它。 錯誤消息是:

mscorlib.dll中發生了“ System.Collections.Generic.KeyNotFoundException”異常。 附加信息:在字典中未指定指定的鍵。

(大約從德語翻譯)

由於每個播放列表可以具有不同數量的歌曲,因此您不需要固定大小的3D矩陣( [,,,] ),而是數組的數組( [][][] )。 您可以在此問題中閱讀它們之間的區別。

話雖如此,您可以使用PlayListTrack[][][]實現您想要的。 您可能會喜歡var allTracks = new PlayListTrack[amountOfGenres][][]; 然后將allTracks每一行初始化為PlayListTrack[][]其大小是與該行匹配的流派的播放列表的數量。 最后,您可以將每個播放列表初始化為PlayListTrack[]其大小是該給定播放列表的歌曲數量。

無論如何,我建議您看一下Dictionary <TKey,TValue>類,該類允許您將唯一鍵(例如,流派的Id)映射到值(例如,播放列表,可以是字典)本身)。

然后,您可能會遇到以下情況:

// Lists of tracks, indexed by their genre id (first string) and
// their playlist id (second string)
var allTracks = new Dictionary<string, Dictionary<string, List<PlayListTrack>>>();

// Examples

// Getting a genre, which is a Dictionary<string, List<PlayListTrack>>
var allJazzPlayLists = allTracks["jazz"];

// Getting a list of songs, which is a List<PlayListTrack>
var songs = allTracks["hip-hop"]["west side"];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM