2013-07-31 2 views
2

Я пытаюсь узнать, как я могу узнать, что пользователи подключены к моему приложению, поэтому эти данные я сохраняю в текстовом файле, но когда я пытаюсь прочитать строку за строкой текстового файла, я хочу передать его в массив для сравнения данных лучше. так вот как я это делаю:Почему я не могу присвоить значение этому массиву в C#?

String folder = Application.StartupPath; 
String file = "users.txt"; 

String str; 
String[] strArray; 
String[][] data; 
int rows = 0; 
StreamReader lines = new StreamReader(folder + file); 
while ((str = lines.ReadLine()) != null) 
{ 
    strArray = str.Split('~'); 
    for (int i = rows; i <= rows; i++) 
    { 
     for (int j = 0; j < strArray.Length; j++) 
     { 
      data[rows][j] = strArray[j]; // here is the error 
     } 
    } 
    rows++; 
} 

Как вы видите, я объявил мой массив данных в ранее, но он говорит, что он не может использовать его причиной является Unassigned.

Заранее спасибо.

+2

«данные» никогда не инициализируются. Ваш первый цикл for бесполезен. Какая у вас ошибка? –

ответ

4

Для объяснения ошибки, вы должны смотреть на неровных массивы. Главное то, что вам нужно инициализировать как внешний массив и внутренние массивы:

int[][] jagged = new int[5][]; // Initialized outer array 
jagged[0] = new int[3];   // Initialized an inner array 

Однако, так как вы не знаете, сколько строк вам нужно раньше времени, вы должны использовать список вместо:

List<List<String>> data = new List<List<String>>(); 
while ((str = lines.ReadLine()) != null) 
{ 
    data.Add(str.Split('~').ToList()); 
} 

Или, если вы просто хотите, один список:

List<String> data = new List<String>(); 
while ((str = lines.ReadLine()) != null) 
{ 
    data.AddRange(str.Split('~')); 
} 
-1
String[][] data = new String[][]; 

вы должны инициализировать его

+0

Скомпилирует ли это для вас? –

2

Вы не инициализирующий массив с чем-нибудь. Возможно, List<List<string>> может быть лучше.

+0

Это потребует создания и добавления внутреннего списка. – lukegravitt

0

Инициализировать массив, чтобы иметь нулевое значение, и вы сделали

String[][] data = null; 
0

Улучшение вашего кода немного. Также используется List of String вместо массива.

String folder = Application.StartupPath; 
    String file = "users.txt"; 
    String str; 

    var strings = new List<string>(); 
    int row = 0; 
    using (var reader = new StreamReader(Path.Combine(folder,file)) 
    { 
    while ((str = reader.ReadLine()) != null) 
    { 
     var splitArray = str.Split('~'); 
     foreach (var str in splitArray) 
     { 
     strings.Add(str); 
     } 
    } 
    } 
+1

Не компилирует ... –

0

Чтобы создать и заполнить массив, вам необходимо знать полученный размер. Если вы используете LINQ и создаете массив в качестве последнего шага, вы можете сделать это в одном сообщении:

var data = File.ReadLines(Path.Combine(Application.StartupPath, "users.txt")) 
       .Select(line => line.Split('~')) 
       .ToArray();