【问题标题】:2D data structure - fixed cols - dynamic rows2D 数据结构 - 固定列 - 动态行
【发布时间】:2012-11-04 22:57:01
【问题描述】:

我需要将字符串数据以表格的形式存储在内存中, 列是固定的,但行将添加到末尾。

如果我事先知道行,我想我可以使用二维字符串数组string[][],但事实并非如此。

我目前创建了一个包含 3 个字段的自定义类并将它们存储在一个列表中,但我意识到这不是很优雅的解决方案,数据看起来像这样

艺术家名称1,专辑名称1,文件名1
艺术家名称2,专辑名称2, 文件名2
艺术家名3、专辑名3、文件名3
等等..

哪种数据结构最适合这个?

【问题讨论】:

  • 据我所知,您已经以正确的方式做到了。
  • 我想如果我可以在不创建自定义类的情况下做到这一点,那不是更好吗?
  • OOP 就是将数据封装成复杂类型(结构或类)

标签: c#


【解决方案1】:

你有很多选择,取决于你想用它做什么。

// Usefull if it's not all strings
List<Tuple<int, string, string>> 

或

// A list of array.
List<string[]> 

【讨论】:

  • .Net 2.0 中有类似元组的东西吗?
  • @Ahmed:该死!好一个,我不知道。但是 Tuple 只是一个泛型类,用于包装特定类型的集合。您可以轻松地自己制作一个,或者创建一个类或结构来保存您想要的数据。
  • +1 Tuple&lt;&gt; 在 C# 4.0 中引入。但是你可以自己创建,like here。
【解决方案2】:

您应该创建一个自定义类:

public class Song 
{
    public string ArtistName { get; set; }
    public string AlbumName { get; set; }
    public string Filename { get; set; }
}

然后你应该有一个列表:

var songs = new List<Song>();

这就是类的作用——不要回避它们。

如果您需要将每首歌曲作为字符串“获取”,您可以在Song 中覆盖.ToString:

public override string ToString()
{
    return string.Format("{0}, {1}, {2}", ArtistName, AlbumName, Filename);
}

【讨论】:

  • @LightStriker,我认为用例不值得 IMO 结构的特质。
  • 为什么不呢?我不认为他打算在创建对象后修改数据。考虑到他只存储字符串......
  • @LightStriker,如果它真的是不可变的,那很好。但我没有做出这样的假设。当songs[0].ArtistName = "Foo" 没有做他想做的事时,我不希望 OP 吓坏了。
【解决方案3】:

您可以使用List&lt;string[]&gt; 或List&lt;List&lt;string&gt;&gt;。第一种情况将允许您添加任意数量的行,并且列将被固定。第二种解决方案更加灵活,您可以根据需要添加任意数量的列。

List<string[]> list = new List<string[]>();
string[] row = new string[3];
row[0] = "artist-name1";
row[1] = "album-name1";
row[2] = "filename1";
list.Add(row);

或者

List<List<string>> list = new List<List<string>>();
List<string> row = new List<string>();
row.Add("artist-name1");
row.Add("album-name1");
row.Add("filename1");
list.Add(row);

【讨论】:

  • 感谢尼克的详尽回答:)
  • @Ahmed 不客气,这是对您问题的直接回答,但我完全同意其他人的观点,即您的第一次尝试是正确的。正如我评论您的问题一样,您应该使用类来封装您的复杂数据类型(即使是这种情况)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-15
相关资源
最近更新 更多