2009-04-06 16 views
0

J'ai obtenu une table (dans le fichier) que je divise en blocs par des espaces.Comment créer une liste multi-dimensionnelle pour ceci en C#?

je besoin d'une structure comme ceci:

----------------------------- 
|21|22|23|33|3323| 
|32|32| 
|434433|545454|5454| 
------------------------------ 

Il est plus comme chaque ligne est sa propre table. Comment dois-je faire cela? J'ai essayé List<List<string>> matrix = new List<List<string>>(); mais je n'arrive pas à trouver un moyen de travailler avec.

EDIT - quelqu'un peut me dire quel est le problème avec ce code? Matrice [0] [0] est la même que la matrice [1] [0] .. il semble que même ligne est ajoutée à la matrice tout le temps, mais je l'effacer ...

static ArrayList ReadFromFile(string filename) 
    StreamReader SR; 
    string S; 
    string[] S_split; 

    SR = File.OpenText(filename); 
    S = SR.ReadLine(); 

    ArrayList myItems = new ArrayList(); 

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

    while (S != null) 
    { 
     row.Clear(); 
     S_split = S.Split(' '); 
     for (int i = 1; i < S_split.GetLength(0); i++) 
     { 
      row.Add(S_split[i]); 
      matrix.Add(row); 
     }    

     S = SR.ReadLine(); 
    } 
    Console.WriteLine(matrix[1][1]); 
    SR.Close(); 
    return myItems; 
} 
+0

Le problème est très simple. Vous créez uniquement un objet de ligne et l'insérez plusieurs fois. Vous devez créer une nouvelle liste pour chaque ligne. Jetez un oeil à ma réponse. –

Répondre

2

Je ne sais pas si j'ai bien compris.

 List<List<int>> table = new List<List<int>>(); 
     List<int> row = new List<int>(); 
     row.Add(21); 
     row.Add(22); 
     row.Add(23); 
     row.Add(33); // and so on 
     table.Add(row); 

     row = new List<int>(); 
     row.Add(1001); 
     row.Add(1002); 
     table.Add(row); 

     MessageBox.Show(table[0][3].ToString()); 

Le programme doit afficher une boîte de message avec le texte "33".

+0

ok et comment puis-je obtenir le nombre de "lignes" dans une "table" pour tester si j'ai raison? – Skuta

+0

table.Count() renvoie le nombre de lignes. –

+0

vous pouvez utiliser table.Count() comme @danbruc suggère :) pour chaque ligne, utilisez la table [0].Count() – Gant

1

Vous devriez pouvoir pour travailler avec lui comme vous vous attendez à traiter avec une liste dans une liste.

matrix.Add(new List<string>); 
matrix[0].Add("a string"); 
1
List<List<String>> matrix = new List<List<String>>(); 

foreach (String line in file) 
{ 
    String[] values = line.Split(new Char[] { ' ' }); 

    matrix.Add(new List<String>(values)); 
} 

Juste itérer votre fichier et pour chaque ligne procédez comme suit.

  1. Générer une nouvelle liste
  2. Remplissez-le avec les données de la ligne
  3. Ajouter la liste pour la ligne actuelle à votre liste pour le dossier complet

Notez que foreach (String line in file) est juste pseudo code. De plus, vous pouvez fusionner les lignes à dans le corps à une seule ligne.

matrix.Add(new List<String>(line.Split(new Char[] { ' ' }))); 
1

Vous décrivez un jagged array. Je ne suis pas vraiment sûr si une liste ne sera pas exagérée? Si vous devez simplement importer les données du fichier et l'utiliser, un tableau en dents de scie devrait être assez simple.

Exemple:

int[][] jaggedArray = new int[][] 
{ 
    new int[] {21, 22, 23, 33, 3323}, 
    new int[] {32, 32}, 
    new int[] {434433, 545454, 5454} 
}; 

vous pouvez aussi l'accumulation du tableau en dents de scie dans une boucle lors du traitement de votre dossier, comme celui-ci:

int[][] result = new int[numberOfLines][]; 
for (int currentLine = 0; currentLine < numberOfLines; currentLine++) 
{ 
    String line = fileStream.ReadLine(); 
    int[] values = SplitAndConvertLine(line); 
    result[currentLine] = values; 
} 
+0

Le problème avec les tableaux dentelés est que vous devez connaître la taille lors de la création. Vous avez la variable numberOfLines dans votre code mais vous ne le savez pas souvent à l'avance. Donc vous construisez une liste et renvoyez un tableau si vous avez terminé. Cela ajoute plus de frais généraux, juste retour de la liste. –

+0

Et si vous devez manipuler les données plus tard, vous allez probablement créer une liste à nouveau, car vous devez ajouter ou supprimer quelque chose. Donc, je préfère absolument la liste en raison de la flexibilité acquise. Et sous le capot, c'est juste un tableau avec un redimensionnement intelligent - pas beaucoup de frais généraux. –

+0

Je l'offre comme une alternative, et déjà noté qu'il ne serait pas sage de les utiliser en cas de changement de données. En fonction de la taille des données, il peut être judicieux de connaître certaines propriétés à l'avance, de sorte que la liste peut réserver une grande capacité à l'avance. –

0

Si vous essayez de lire à partir du fichier puis essayez quelque chose comme le suivant (Notez le code suivant n'a pas été exécuté à travers un compilateur)

List<string[]> matrix = new List<string[]>(); 
while(!instream.EndOfStream) 
{ 
    var values = instream.ReadLine().Split(new[] {' '}); 
    matrix.Add(values); 
}