Возможны ли 2-мерные списки в С#?

Я бы хотел создать многомерный список. Для справки, я работаю над анализатором плейлистов.

У меня есть файл/файл-список, который моя программа сохраняет в стандартном списке. Одна строка из файла в каждой записи списка.

Затем я анализирую список с регулярными выражениями, чтобы найти определенные строки. Некоторые данные/результаты из строк должны быть помещены в новый многомерный список; так как я не знаю, сколько результатов/данных у меня получится, я не могу использовать многомерный массив.

Вот данные, которые я хочу вставить:

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] получит TrackID из песни 1, mlist [1] [0] из песни 2 и т.д.

Но у меня возникают огромные проблемы, создающие многомерный список. До сих пор я придумал

List<List<string>> matrix = new List<List<string>>();

Но у меня не было особого прогресса: (

Ответ 1

Ну, конечно, вы можете использовать List<List<string>>, где вы тогда пишете:

List<string> track = new List<string>();
track.Add("2349");
track.Add("The Prime Time of Your Life");
// etc
matrix.Add(track);

Но зачем вам это делать вместо того, чтобы создавать собственный класс для представления дорожки, с характеристиками Track ID, Name, Artist, Album, Play Count и Skip Count? Тогда просто .

Ответ 2

Как Jon Skeet упомянул, что вы можете сделать это с помощью List<Track>. Класс 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; }
}

И чтобы создать список треков как 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];

Надеюсь, что это поможет.

Ответ 3

Это самый простой способ, который я нашел для этого.

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

Ответ 4

Другая работа, вокруг которой я пользовалась, была...

List<int []> itemIDs = new List<int[]>();

itemIDs.Add( new int[2] { 101, 202 } );

Библиотека, над которой я работаю, имеет очень формальную структуру классов, и я не делал там лишних вещей для привилегии записи двух "родственных" цепей.

Опирается на программиста, который вводит только массив из 2 элементов, но поскольку это не общий элемент, я думаю, что он работает.

Ответ 5

Вот как сделать двухмерный список

        // 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";

Помните об опасности доступа к месту, которое не заселено.

Ответ 6

Вы также можете... так,

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

если вам нужен другой элемент (ребенок), создайте новый экземпляр child,

Child=new List<Object>();
child.Add(2323);
child.Add("asds");
child.Add("jshds");
.
.
Parent.Add(child);

Ответ 7

Я использовал:

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

Ответ 8

Вы также можете использовать DataTable - вы можете определить количество столбцов и их типы, а затем добавить строки http://www.dotnetperls.com/datatable

Ответ 9

Вот кое-что, что я сделал некоторое время назад для игрового движка, над которым я работал. Он использовался как владелец локального объекта. В основном, вы используете его как обычный список, но он содержит значение в позиции того, что когда-либо было именем строки (или 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);
        }
    }
}