Pregunta ¿Son posibles 2 listas dimensionales en c #?


Me gustaría establecer una lista multidimensional. Como referencia, estoy trabajando en un analizador de lista de reproducción.

Tengo un archivo / lista de archivos, que mi programa guarda en una lista estándar. Una línea del archivo en cada entrada de la lista.

Luego analizo la lista con expresiones regulares para encontrar líneas específicas. Algunos de los datos / resultados de las líneas deben colocarse en un nuevo multidimensional lista; ya que no sé con cuántos resultados / datos terminaré, no puedo usar una matriz multidimensional.

Aquí están los datos que quiero insertar:

Lista
(
    [0] => Lista
        (
            [0] => ID de pista
            [1] => Nombre
            [2] => Artista
            [3] => Álbum
            [4] => Jugar cuenta
            [5] => Omitir recuento

        )
    [1] => Lista
        (
Y así....

Ejemplo real:

Lista
(
    [0] => Lista
        (
            [0] => 2349
            [1] => El mejor momento de tu vida
            [2] => Daft Punk
            [3] => Humano después de todo
            [4] => 3
            [5] => 2

        )
    [1] => Lista
        (

Así que sí, mlist [0] [0] obtendría TrackID de la canción 1, mlist [1] [0] de la canción 2, etc.

Pero estoy teniendo grandes problemas al crear una lista multidimensional. Hasta ahora he llegado con

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

Pero realmente no he tenido mucho más progreso :(


75
2018-03-20 08:06


origen


Respuestas:


Bueno, ciertamente poder usar una List<List<string>> donde entonces escribirías:

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

Pero, ¿por qué harías eso en lugar de construir tu propia clase para representar una pista, con las propiedades Track ID, Name, Artist, Album, Play Count y Skip Count? Entonces solo ten una List<Track>.


120
2018-03-20 08:11



Como Jon Skeet mencionado, puedes hacerlo con un List<Track> en lugar. La clase Track se vería así:

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

Y para crear una lista de pistas como List<Track> simplemente haz esto:

var trackList = new List<Track>();

Agregar pistas puede ser tan simple como esto:

trackList.add( new Track {
    TrackID = 1234,
    Name = "I'm Gonna Be (500 Miles)",
    Artist = "The Proclaimers",
    Album = "Finest",
    PlayCount = 10,
    SkipCount = 1
});

El acceso a las pistas se puede hacer con el operador de indexación:

Track firstTrack = trackList[0];

Espero que esto ayude.


89
2018-03-20 08:20



Esta es la forma más fácil que he encontrado para hacerlo.

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

Recuperar valores es aún más fácil

string title = matrix[0][1]; //Retrieve value at index 1 from sub List at index 0

30
2017-08-29 16:48



otro trabajo alrededor del cual he usado fue ...

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

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

La biblioteca en la que estoy trabajando tiene una estructura de clase muy formal y no quería material extra allí para el privilegio de grabar dos ints 'relacionados'.

Se basa en que el programador ingrese solo una matriz de 2 elementos, pero como no es un elemento común, creo que funciona.


11
2018-06-25 03:36



También puedes ... hacer de esta manera,

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

si necesita otro artículo (niño), crea una nueva instancia de hijo,

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

2
2017-10-07 02:54



Solía:

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

eso es igual a:

List1
(
[0] => List2 // List1[0][x]
    (
        [0] => Test  // List[0][0] etc.
        [1] => Test2

    )
[1] => List2
    (
        [0] => Test3

1
2017-11-24 07:31



Aquí está cómo hacer una lista bidimensional

// Generando listas en un bucle.             List> biglist = new List> ();

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

Tenga en cuenta el peligro de acceder a una ubicación que no está poblada.


1
2017-08-15 22:41



También puede usar DataTable: puede definir el número de columnas y sus tipos y luego agregar filas http://www.dotnetperls.com/datatable


0
2018-02-13 11:10



Aquí hay algo que hice hace un tiempo para un motor de juego en el que estaba trabajando. Se usó como un titular de variable de objeto local. Básicamente, lo usa como una lista normal, pero mantiene el valor en la posición de cualquier nombre de cadena (o ID). Un poco de modificación, y tendrás tu lista 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);
        }
    }
}

0
2018-06-14 09:07