我即将创建一个媒体播放器应用程序,它将处理多个播放列表,当然还有多首歌曲。我已经为播放列表名称创建了一个字符串数组,它们存储在一个文本文件中。我使用File.ReadAllLines
方法加载它们,如下所示:
1darray = File.ReadAllLines("textfilename.txt");
每个播放列表都有自己的ID,我有一个存储播放列表数量的变量。 我想用相同的方法阅读歌曲的路径,但它需要一个2D数组
2Darray[playlistID, songID]
与第一种方法一样,我不必指定数组的每个元素,我现在需要指定播放列表ID,并让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
答案 1 :(得分:1)
虽然很多人已经为您的问题提出了替代解决方案,但还没有人解释原始错误的含义。您需要了解的是C#区分了所谓的锯齿状数组和多维数组。
锯齿状阵列本质上是数组。声明一个看起来像这样:
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];
请注意,您必须在单个[]
运算符中指定两个索引。这些是您想要的值的“坐标”,可以这么说。
这是你的错误的来源。你有一个多维数组,并且你试图访问它的各个数组元素,这没有任何意义。要执行您最初尝试执行的操作,您需要使用锯齿状数组。
答案 2 :(得分:0)
所以基本上你可以用字典&gt;映射所有播放列表及其各自的歌曲。当然,这可以通过类和关系更好地完成,但为了保持简单,我们将使用第一个示例:
//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]];