我想设置一个多维列表。 作为参考,我正在研究播放列表分析器。
我有一个文件/文件列表,我的程序保存在标准列表中。每个列表条目中文件的一行。
然后,我使用正则表达式分析列表以查找特定行。 这些行中的一些数据/结果需要放入一个新的多维列表中;因为我不知道我最终会得到多少结果/数据,所以我不能使用多维数组。
以下是我要插入的数据:
List ( [0] => List ( [0] => Track ID [1] => Name [2] => Artist [3] => Album [4] => Play Count [5] => Skip Count ) [1] => List ( And so on....
真实示例:
List ( [0] => List ( [0] => 2349 [1] => The Prime Time of Your Life [2] => Daft Punk [3] => Human After All [4] => 3 [5] => 2 ) [1] => List (
所以是的,mlist [0] [0]将从歌曲1获得TrackID,从歌曲2等获得mlist [1] [0]。
但是我在创建多维列表时遇到了很多问题。 到目前为止,我已经提出了
List<List<string>> matrix = new List<List<string>>();
但我没有取得更多进展:(
答案 0 :(得分:127)
嗯,你肯定可以使用List<List<string>>
然后你写下:
List<string> track = new List<string>();
track.Add("2349");
track.Add("The Prime Time of Your Life");
// etc
matrix.Add(track);
但是你为什么要这样做而不是建立自己的类来表示一个曲目,包括曲目ID,姓名,艺术家,专辑,播放计数和跳过计数属性?然后只需List<Track>
。
答案 1 :(得分:98)
如Jon Skeet所述,您可以使用List<Track>
代替public class Track {
public int TrackID { get; set; }
public string Name { get; set; }
public string Artist { get; set; }
public string Album { get; set; }
public int PlayCount { get; set; }
public int SkipCount { get; set; }
}
。 Track类看起来像这样:
List<Track>
要创建一个跟踪列表为var trackList = new List<Track>();
,您只需执行以下操作:
trackList.add( new Track {
TrackID = 1234,
Name = "I'm Gonna Be (500 Miles)",
Artist = "The Proclaimers",
Album = "Finest",
PlayCount = 10,
SkipCount = 1
});
添加曲目可以这么简单:
Track firstTrack = trackList[0];
可以使用索引操作符来访问轨道:
{{1}}
希望这有帮助。
答案 2 :(得分:32)
这是我发现的最简单方法。
List<List<String>> matrix= new List<List<String>>(); //Creates new nested List
matrix.Add(new List<String>()); //Adds new sub List
matrix[0].Add("2349"); //Add values to the sub List at index 0
matrix[0].Add("The Prime of Your Life");
matrix[0].Add("Daft Punk");
matrix[0].Add("Human After All");
matrix[0].Add("3");
matrix[0].Add("2");
更容易检索值
string title = matrix[0][1]; //Retrieve value at index 1 from sub List at index 0
答案 3 :(得分:11)
我使用过的另一项工作是......
List<int []> itemIDs = new List<int[]>();
itemIDs.Add( new int[2] { 101, 202 } );
我正在研究的图书馆有一个非常正式的课程结构,我并没有在那里有效地记录两个“相关”的整数。
依赖于程序员只输入2项数组,但因为它不是一个常见的项目,我认为它的工作原理。
答案 4 :(得分:2)
以下是如何制作二维列表
// Generating lists in a loop.
List<List<string>> biglist = new List<List<string>>();
for(int i = 1; i <= 10; i++)
{
List<string> list1 = new List<string>();
biglist.Add(list1);
}
// Populating the lists
for (int i = 0; i < 10; i++)
{
for(int j = 0; j < 10; j++)
{
biglist[i].Add((i).ToString() + " " + j.ToString());
}
}
textbox1.Text = biglist[5][9] + "\n";
请注意访问未填充位置的危险。
答案 5 :(得分:2)
你也可以......以这种方式,
window.global = true;
for(;;){ gobal_reuse = false; }
var simple;
var simple_assignment = true;
var simple, list_variable;
var simple, list_variable, list_assignment = true, list_variable;
for (gobal=true;;) { ... }
while(true){ simple = true; }
for(;;)
var block_without_brace = true;
// and the list goes on
如果你需要另一件物品(孩子), 创建一个新的子实例,
List<List<Object>> Parent=new List<List<Object>>();
List<Object> Child=new List<Object>();
child.Add(2349);
child.Add("Daft Punk");
child.Add("Human");
.
.
Parent.Add(child);
答案 6 :(得分:1)
我用过:
List<List<String>> List1 = new List<List<String>>
var List<int> = new List<int>();
List.add("Test");
List.add("Test2");
List1.add(List);
var List<int> = new List<int>();
List.add("Test3");
List1.add(List);
等于:
List1
(
[0] => List2 // List1[0][x]
(
[0] => Test // List[0][0] etc.
[1] => Test2
)
[1] => List2
(
[0] => Test3
答案 7 :(得分:0)
您还可以使用DataTable - 您可以定义列数及其类型,然后添加行 http://www.dotnetperls.com/datatable
答案 8 :(得分:0)
这是我前一段时间为我正在制作的游戏引擎做的一些事情。它被用作本地对象变量持有者。基本上,您将它用作普通列表,但它将值保存在字符串名称(或ID)的位置。稍加修改,您将获得2D列表。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace GameEngineInterpreter
{
public class VariableList<T>
{
private List<string> list1;
private List<T> list2;
/// <summary>
/// Initialize a new Variable List
/// </summary>
public VariableList()
{
list1 = new List<string>();
list2 = new List<T>();
}
/// <summary>
/// Set the value of a variable. If the variable does not exist, then it is created
/// </summary>
/// <param name="variable">Name or ID of the variable</param>
/// <param name="value">The value of the variable</param>
public void Set(string variable, T value)
{
if (!list1.Contains(variable))
{
list1.Add(variable);
list2.Add(value);
}
else
{
list2[list1.IndexOf(variable)] = value;
}
}
/// <summary>
/// Remove the variable if it exists
/// </summary>
/// <param name="variable">Name or ID of the variable</param>
public void Remove(string variable)
{
if (list1.Contains(variable))
{
list2.RemoveAt(list1.IndexOf(variable));
list1.RemoveAt(list1.IndexOf(variable));
}
}
/// <summary>
/// Clears the variable list
/// </summary>
public void Clear()
{
list1.Clear();
list2.Clear();
}
/// <summary>
/// Get the value of the variable if it exists
/// </summary>
/// <param name="variable">Name or ID of the variable</param>
/// <returns>Value</returns>
public T Get(string variable)
{
if (list1.Contains(variable))
{
return (list2[list1.IndexOf(variable)]);
}
else
{
return default(T);
}
}
/// <summary>
/// Get a string list of all the variables
/// </summary>
/// <returns>List string</string></returns>
public List<string> GetList()
{
return (list1);
}
}
}
答案 9 :(得分:0)
仅仅因为它还没有被提及,有时我更喜欢 List
var trackList = new List<Dictionary<string, string>>();
var track = new Dictionary<string, string>();
track.Add("TrackID" , "1234");
track.Add("Name" , "I'm Gonna Be (500 Miles)");
track.Add("Artist" , "The Proclaimers");
track.Add("Album" , "Finest");
track.Add("PlayCount", "10");
track.Add("SkipCount", "1");
trackList.Add(track);
这实际上比自定义对象有几个好处,即您可以向某些轨道添加新的键值,而无需将其添加到所有轨道,并且现有代码仍然可以工作而无需重新编译。显然,如果您编写代码以使用这些新键执行某些操作,则必须重新编译,但这不是必需的。其次,如果你曾经将数据存储在一个文件中,你可能希望它是人类可读的(我会),在这种情况下,无论如何它都是字符串。您可以使用文本编辑器添加、删除或修改键或值,而这个数据结构能够处理它。