c#中是否可以使用二维列表?

时间:2009-03-20 08:06:35

标签: c# list

我想设置一个多维列表。 作为参考,我正在研究播放列表分析器。

我有一个文件/文件列表,我的程序保存在标准列表中。每个列表条目中文件的一行。

然后,我使用正则表达式分析列表以查找特定行。 这些行中的一些数据/结果需要放入一个新的多维列表中;因为我不知道我最终会得到多少结果/数据,所以我不能使用多维数组。

以下是我要插入的数据:

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>>();

但我没有取得更多进展:(

10 个答案:

答案 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>。在某些情况下,无论出于何种原因我都不想创建自定义对象,而这种超级简单的数据结构非常灵活。我意识到一切都是一个效率低下的字符串,它会迫使您在增加 PlayCount 时进行解析和字符串化,但对某些人来说可能值得。

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);

这实际上比自定义对象有几个好处,即您可以向某些轨道添加新的键值,而无需将其添加到所有轨道,并且现有代码仍然可以工作而无需重新编译。显然,如果您编写代码以使用这些新键执行某些操作,则必须重新编译,但这不是必需的。其次,如果你曾经将数据存储在一个文件中,你可能希望它是人类可读的(我会),在这种情况下,无论如何它都是字符串。您可以使用文本编辑器添加、删除或修改键或值,而这个数据结构能够处理它。