2009-04-06 2 views
0

У меня есть таблица (в файле), которую я разделил на блоки пробелами.Как создать многомерный список для этого в C#?

мне нужна структура, как это:

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

Это больше похоже на каждый ряд своя таблица. Как мне это сделать?

Я пробовал List<List<string>> matrix = new List<List<string>>(); но я не могу найти способ работать с ним.

EDIT - может кто-нибудь сказать мне, что не так с этим кодом ???? Матрица [0] [0] такое же, как матрица [1] [0] .. кажется, что та же строка добавляется к матрице все время, но я очистить его ...

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

Проблема очень проста. Вы создаете только один объект строки и вставляете его несколько раз. Вы должны создать новый список для каждой строки. Взгляните на мой ответ. –

ответ

2

Не уверен, что я правильно понял это.

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

Программа должна отображать окно сообщения с текстом «33».

+0

ok и как мне получить число «строк» ​​в «таблице», чтобы проверить, правильно ли я прав? – Skuta

+0

table.Count() возвращает количество строк. –

+0

вы можете использовать table.Count() как @danbruc предлагает :) для отдельной строки, используйте таблицу [0].Count() – Gant

1

Вы должны быть в состоянии работать с ним, так как вы ожидаете иметь дело со списком в списке.

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

Просто перебирать файл и для каждой строки выполните следующие действия.

  1. Сформировать новый список
  2. Заполните его с данными по линии
  3. Добавить в список для текущей строки в список для полного файла

Обратите внимание, что foreach (String line in file) просто псевдо код. Далее вы можете объединить строки в тело в одну строку.

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

Вы описываете jagged array. Я не совсем уверен, что список не будет излишним? Если вам просто нужно импортировать данные из файла и использовать его, массив с зазубринами должен быть достаточно простым.

Пример:

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

вы можете также раскачка зубчатая массив в цикле при обработке файла, например:

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

Проблема с использованием зубчатых массивов заключается в том, что вы должны знать размер при его создании. У вас есть переменная numberOfLines в коде, но вы часто не знаете заранее. Таким образом, вы создадите список и вернете массив, если закончите. Это добавляет больше накладных расходов, а затем просто возвращает список. –

+0

И если вам придется манипулировать данными позже, вы, вероятно, снова создадите список, потому что вам нужно что-то добавить или удалить. Поэтому я абсолютно предпочитаю список из-за приобретенной гибкости. И под капотом это всего лишь массив с умным изменением размера - не так много накладных расходов. –

+0

Я предлагаю это в качестве альтернативы и уже отметил, что было бы нецелесообразно использовать их в случае изменения данных. В зависимости от размера данных может быть разумным заранее знать определенные свойства, поэтому список может зарезервировать большую емкость заранее. –

0

Если вы пытаетесь прочитать из файла, то попробуйте что-нибудь как указано ниже (Обратите внимание, что следующий код не был запущен через компилятор)

List<string[]> matrix = new List<string[]>(); 
while(!instream.EndOfStream) 
{ 
    var values = instream.ReadLine().Split(new[] {' '}); 
    matrix.Add(values); 
} 
Смежные вопросы