webentwicklung-frage-antwort-db.com.de

Sind zweidimensionale Listen in c # möglich?

Ich möchte eine mehrdimensionale Liste erstellen ... Als Referenz arbeite ich an einem Playlist-Analysator.

Ich habe eine Datei/Dateiliste, die mein Programm in einer Standardliste speichert. Eine Zeile aus der Datei in jedem Listeneintrag.

Dann analysiere ich die Liste mit regulären Ausdrücken, um bestimmte Zeilen zu finden. Einige der Daten/Ergebnisse der Zeilen müssen in eine neue multidimensionale liste eingefügt werden. Da ich nicht weiß, mit wie vielen Ergebnissen/Daten ich ende, kann ich kein mehrdimensionales Array verwenden.

Hier sind die Daten, die ich einfügen möchte:

 Liste 
 (
 [0] => Liste 
 (
 [0] => Spur ID 
 [1] => Name 
 [2] => Interpret
 [3] => Album 
 [4] => Anzahl abspielen 
 [5] => Anzahl überspringen 

) 
 [1] => Liste 
 (
 .Und so weiter....

Echtes Beispiel:

 Liste 
 (
 [0] => Liste 
 (
 [0] => 2349 
 [1] => Die Hauptzeit Ihres Lebens 
 [2] => Daft Punk 
 [3] => Human After All 
 [4] => 3 
 [5] => 2 

) 
 [1] => List
 (

Also, mlist [0] [0] würde TrackID von Song 1 erhalten, Mlist [1] [0] von Song 2 usw.

Aber ich habe große Probleme, eine multidimensionale Liste zu erstellen ... Bisher bin ich dazu gekommen 

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

Aber ich habe nicht wirklich viel mehr Fortschritt gemacht :(

80
CasperT

Nun, sicherlich can verwenden Sie einen List<List<string>>, in den Sie dann schreiben würden:

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

Aber warum sollten Sie das tun, anstatt eine eigene Klasse zu erstellen, die einen Track darstellt, mit Track-ID, Name, Interpret, Album, Play Count und Skip Count. Dann haben Sie einfach einen List<Track>.

124
Jon Skeet

Wie Jon Skeet erwähnt, können Sie dies stattdessen mit einem List<Track> tun. Die Track-Klasse würde ungefähr so ​​aussehen:

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

Und um eine Trackliste als List<Track> zu erstellen, machen Sie einfach Folgendes:

var trackList = new List<Track>();

Das Hinzufügen von Tracks kann so einfach sein:

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

Der Zugriff auf Tracks kann mit dem Indexierungsoperator erfolgen:

Track firstTrack = trackList[0];

Hoffe das hilft.

95
Spoike

Dies ist der einfachste Weg, den ich gefunden habe.

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

Das Abrufen von Werten ist noch einfacher

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

eine andere Arbeit, um die ich gearbeitet habe, war ...

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

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

Die Bibliothek, an der ich gerade arbeite, hat eine sehr formale Klassenstruktur, und ich habe nicht wirklich genug Material für das Privileg, zwei "verwandte" Ints aufnehmen zu können.

Stellt sicher, dass der Programmierer nur ein Array mit 2 Elementen eingibt, aber da dies kein gewöhnliches Element ist, denke ich, dass es funktioniert. 

11
paul jamison

So erstellen Sie eine zweidimensionale Liste

// Listen in einer Schleife erzeugen . Liste> biglist = neue Liste> ();

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

Seien Sie sich der Gefahr bewusst, auf einen Standort zuzugreifen, der nicht besetzt ist.

2
Ben

Sie können auch auf diese Weise ... tun

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

wenn Sie ein anderes Element (untergeordnetes Element) benötigen, erstellen Sie eine neue Instanz von untergeordnetem Element.

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

Ich benutzte:

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

das entspricht:

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

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

Sie können auch DataTable verwenden. Sie können dann die Anzahl der Spalten und ihre Typen definieren und dann Zeilen hinzufügen http://www.dotnetperls.com/datatable

0
Val

Hier ist ein kleines Etwas, das ich vor einiger Zeit für eine Game Engine gemacht habe, an der ich gearbeitet habe. Es wurde als lokaler Objektvariablenhalter verwendet. Grundsätzlich verwenden Sie es als normale Liste, aber es enthält den Wert an der Position des Stringnamens (oder der ID). Eine kleine Änderung, und Sie haben Ihre 2D-Liste.

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
Joe Horrell