2014-01-31 52 views
1

我即將創建一個媒體播放器應用程序,它將處理多個播放列表,當然還有多首歌曲。我爲播放列表名稱創建了一個字符串數組,它們存儲在一個文本文件中。我加載它們與File.ReadAllLines方法是這樣的:二維數組上的File.ReadAllLines方法

1darray = File.ReadAllLines("textfilename.txt"); 

每個播放列表都有自己的ID,我有存儲的播放列表數的變量。 我想讀用同樣的方法歌曲的路徑,但它需要一個二維數組

2Darray[playlistID, songID] 

與我沒有指定數組的每個元素的第一個方法,我需要現在指定playlistID,並讓File.ReadAllLines方法來填充songID元素,但它不`噸的工作是這樣的:

2Darray[playlistID] = File.ReadAllLines("textfilename.txt"); 

它說,數[]內指數的錯誤;預計2.

如何處理它?

希望你明白我的壞英語!

+0

代碼比單詞好..向我們展示適當的代碼來展示您的問題。 –

回答

1

的播放列表文件掃描目錄:Directory class

然後枚舉找到的文件:

foreach (string filename in filenames) 
{ 
    // ... 
} 

使用每個filename作爲播放列表ID:

Dictionary<string, string[]> playlists; 

收集字典中的每個文件的行:

playlists.Add(filename, File.ReadAllLines(filename)); 

獲取特定的播放列表中的條目(在這裏,「dupestep.pl」的第4次):

playlists["dupestep.pl"][3] // index 3 is the 4th, because it's zero-based 

從這裏開始,你應該能夠實現任何你所需要的。

抽象播放列表的列表,你可以提取鍵列表索引轉換爲文件名,反之亦然:

playlists.Keys 
+0

+1。字典是一個很好的解決方案。 –

0

因此,基本上可以用字典各自的歌曲播放列表所有映射>。 Ofcourse這是可以做到使用類和關係較好,但保持它的簡單,我們將使用第一個例子:

//get all playlists 
string[] playLists = File.ReadAllLines("playLists.txt"); 

//storage 
Dictionary<string, List<string>> playListsToSongsMap = new Dictionary<string, List<string>>(); 

//iterate the readed playlists 
foreach (string playlist in playLists) 
{ 
    if (!playListsToSongsMap.ContainsKey(playlist)) 
    { 
     playListsToSongsMap[playlist] = new List<string>(); 
    } 

    //add songs to each playlist 
    playListsToSongsMap[playlist].AddRange(File.ReadLines("playListWithsongsPath")); 
} 

//get all playlits 
List<string> allPlayLists = playListsToSongsMap.Keys.ToList(); 

//get all songs in a playlist 
List<string> songsInPlaylist = playListsToSongsMap[allPlayLists[0]]; 
1

雖然很多人都認爲你的問題的替代解決方案,還沒有人解釋一下原來的錯誤手段。你需要理解的是C#在所謂的鋸齒狀數組和多維數組之間作了區分。

A 交錯排列本質上是一個陣列陣列。聲明一個看起來像這樣:

int[][] jaggedArray = new int[4][]; 

這產生具有四個元件的陣列,並且每個這些四個元素可以是int任何陣列尺寸的任何的,。這就是爲什麼這種數組被稱爲「鋸齒狀」的原因:某些元素可能比其他元素更大。你可以想象它看起來像這樣:

[0, 1] 
[5, 3, 2, 1] 
[] 
[9, 8, 7, 6, 5, 4, 2] 

注意鋸齒狀的邊緣。

與申報一致,呈鋸齒狀排列的訪問是這樣的:

int[] element = jaggedArray[1]; 
int value = jaggedArray[1][2]; // equivalent to element[2] 

多維數組表現不同。多維陣列聲明如下:

int[,] multidimArray = new int[4, 4]; 

與鋸齒陣列不同,多維數組指定兩個維度的大小。 這種陣列中的所有元素都具有相同的大小。你可以想象它看起來更像這樣:

[0, 1, 2, 3, 
5, 4, 3, 2, 
0, 0, 0, 0, 
9, 8, 7, 4] 

多維數組也必須以不同的方式訪問。與有鋸齒的數組(有效陣列數組)不同,多維數組被視爲單一的內聚單元。這樣做:

int[] element = multidimArray[3]; 

...沒有任何意義,因爲多維數組不是由小數組組成的。您只能在陣列中訪問個人價值觀,和你這樣做是這樣的:

int value = multidimArray[3, 2]; 

注意,您必須在單個[]操作中同時指定索引。這就是你想要的價值的「座標」,可以這麼說。

這是您的錯誤的來源。你有一個多維數組,你試圖訪問它的單個數組元素,這沒有任何意義。要做你最初想做的事情,你需要使用鋸齒狀的數組。