Сбор 2d массивов и сохранение в файл - PullRequest
0 голосов
/ 31 мая 2018

В моей программе на c # я постоянно создаю двумерные двойные массивы.Мой вопрос заключается в том, что я хочу создать другой список или массив (3d?), И в конце я хочу сохранить все 2d массивы в файл.Ниже код добавляет один 2d массив в файл. Как мне сохранить все 2d массивы и сохранить их одинаково.Спасибо.

static void Main(string[] args) 
{ var array = new string[4, 3]; 
  array[0, 0] = "A"; 
  array[0, 1] = "B"; 
  array[0, 2] = "C"; 
  array[1, 0] = "D"; 
  array[1, 1] = "E"; 
  array[1, 2] = "F"; 
  array[2, 0] = "G"; 
  array[2, 1] = "H"; 
  array[2, 2] = "I"; 
  array[3, 0] = "J"; 
  array[3, 1] = "K"; 
  array[3, 2] = "L"; 
  using (var sw = new StreamWriter("outputText.txt")) 
  { 
     for (int i = 0; i < 4; i++) 
     { 
        for (int j = 0; j < 3; j++) 
        { 
           sw.Write(array[i,j] + " "); 
        } 
        sw.Write("\n"); 
     } 
     sw.Flush(); 
     sw.Close(); 
  } 
}

1 Ответ

0 голосов
/ 31 мая 2018

Если вы сохраняете их в один и тот же файл, выберите какой-нибудь символ разрыва и напечатайте его после каждого массива, например,

1 2 4
5 6 7
#
0 0
3 4
#
9 9
#

Представляет 3 разных 2d-массива.Затем, когда вы снова читаете данные, читайте строки, пока не наберете символ # и не закончите текущий 2d массив / не начните новый там.Еще одна вещь, которую вы можете захотеть сделать, это предшествовать каждому массиву с его размерами x / y, например,

2 3
0 0
0 0
0 0
#

. 2 3 говорит нам ожидать массива 2x3.

Чтобы написать что-то вроде этого:

public void Write(List<string[,]> arrays, string filepath)
{
    using (StreamWriter sw = new StreamWriter(filepath))
    {
        foreach(string[,] array in arrays)
        {
            sw.WriteLine(array.GetLength(0) + " " + array.GetLength(1)); // write dimensions
            int i = 0;
            while(i < array.GetLength(0))
            {
                string line = "";
                int o = 0;
                while(o < array.GetLength(1))
                {
                    line = line + array[i, o];
                    if(o+1 < array.GetLength(1))
                    {
                        line = line + " ";
                    }
                    o++;
                }
                sw.WriteLine(line);
                i++;
            }
            sw.WriteLine("#");
        }
    }
}

Чтобы прочесть что-то вроде этого, вы получите весь список массивов,

using (StreamReader sr = new StreamReader(filepath))
{
    bool inarray = false;
    while (!sr.EndOfStream)
    {
        string s = sr.ReadLine();
        List<string> words = s.Split(' ').ToList();
        string[,] currentArray = null;
        int rowcount = 0;
        List<string[,]> arrays = new List<string[,]>();
        if (!inarray)
        {
            // not in an array, check for dimension numbers
            int x = 0;
            int y = 0;
            try
            {
                x = int.Parse(words[0]);
                y = int.Parse(words[1]);
            }
            catch
            {
                continue; // couldn't parse it, try the next line
            }
            inarray = true;
            currentArray = new string[x, y];
            arrays.Add(currentArray);
            rowcount = 0;
        }
        else
        {
            // we're in an array
            // first check if we've hit the # stop character
            if (words[0].Equals("#"))
            {
                inarray = false;
                continue;
            }

            // otherwise, add this row to the array
            int i = 0;
            while(i< words.Count)
            {
                currentArray[i, rowcount] = words[i];
                i++;
            }
            rowcount++;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...