首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >二维数组的File.ReadAllLines方法

二维数组的File.ReadAllLines方法
EN

Stack Overflow用户
提问于 2014-01-31 18:49:11
回答 3查看 734关注 0票数 1

我即将创建一个媒体播放器应用程序,它将处理多个播放列表,当然,多首歌曲。我已经为播放列表名称创建了一个字符串数组,它们存储在一个文本文件中。我用File.ReadAllLines方法加载它们,如下所示:

代码语言:javascript
复制
1darray = File.ReadAllLines("textfilename.txt");

每个播放列表都有自己的ID,我有一个变量来存储播放列表的数量。我想用同样的方法读取歌曲的路径,但它需要一个2D数组

代码语言:javascript
复制
2Darray[playlistID, songID]

与第一个方法一样,我不必指定数组的每个元素,现在我需要指定playlistID,并让File.ReadAllLines方法填充songID元素,但它不是这样工作的:

代码语言:javascript
复制
2Darray[playlistID] = File.ReadAllLines("textfilename.txt");

它指出[]内的索引数目错误;预期为2。

如何应对?

希望你能理解我糟糕的英语!

EN

回答 3

Stack Overflow用户

发布于 2014-01-31 18:56:22

扫描播放列表文件的目录:Directory class

然后枚举找到的文件:

代码语言:javascript
复制
foreach (string filename in filenames)
{
    // ...
}

使用每个filename作为播放列表ID:

代码语言:javascript
复制
Dictionary<string, string[]> playlists;

在字典中收集每个文件的行:

代码语言:javascript
复制
playlists.Add(filename, File.ReadAllLines(filename));

获取特定播放列表的条目(这里是“dupestep.pl”的第4个条目):

代码语言:javascript
复制
playlists["dupestep.pl"][3] // index 3 is the 4th, because it's zero-based

从现在开始,你应该能够实现你需要的任何东西。

要提取播放列表列表,您可以提取关键字列表以将索引转换为文件名,反之亦然:

代码语言:javascript
复制
playlists.Keys
票数 1
EN

Stack Overflow用户

发布于 2014-01-31 23:07:29

虽然许多人已经为您的问题提出了替代解决方案,但还没有人解释原始错误的含义。您需要了解的是,C#对所谓的锯齿数组和多维数组进行了区分。

交错数组本质上是一个数组的数组。声明一个看起来像这样:

代码语言:javascript
复制
int[][] jaggedArray = new int[4][];

这将创建一个包含四个元素的数组,这四个元素中的每个元素都可以是任意大小的int__数组。这就是为什么这样的数组被称为“锯齿”:一些元素可能比其他元素更大。你可以想象它看起来像这样:

代码语言:javascript
复制
[0, 1]
[5, 3, 2, 1]
[]
[9, 8, 7, 6, 5, 4, 2]

注意锯齿状的边缘。

为了与声明保持一致,锯齿数组的访问方式如下:

代码语言:javascript
复制
int[] element = jaggedArray[1];
int   value   = jaggedArray[1][2]; // equivalent to element[2]

多维数组的行为有所不同。多维数组的声明方式如下:

代码语言:javascript
复制
int[,] multidimArray = new int[4, 4];

与交错数组不同,多维数组指定两个维度的大小。这样的数组中的所有元素都具有相同的大小。你可以想象它看起来更像这样:

代码语言:javascript
复制
[0, 1, 2, 3,
 5, 4, 3, 2,
 0, 0, 0, 0,
 9, 8, 7, 4]

多维数组的访问方式也必须稍有不同。与交错数组不同,交错数组实际上是数组的数组,多维数组被视为单个内聚单元。执行此操作:

代码语言:javascript
复制
int[] element = multidimArray[3];

...没有任何意义,因为多维数组不是由更小的数组组成的.您只能访问数组中的各个值,操作方法如下:

代码语言:javascript
复制
int value = multidimArray[3, 2];

请注意,您必须在单个[]操作符中指定这两个索引。可以说,这些是您想要的值的“坐标”。

这就是你的错误的来源。您有一个多维数组,并且您试图访问它的各个数组元素,这没有任何意义。要执行最初尝试执行的操作,您需要使用锯齿数组。

票数 1
EN

Stack Overflow用户

发布于 2014-01-31 19:20:19

所以基本上你可以用一个Dictionary>来映射所有的播放列表和它们各自的歌曲。当然,使用类和关系可以做得更好,但是为了简单起见,我们将使用第一个示例:

代码语言:javascript
复制
//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]];
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21478173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档