Как сохранить [,] массив в файл?

350
29 октября 2017, 17:04

Как сохранить двумерный массив (объявляю как [,]) в .txt файл как он есть? В матрице или бинарном видe — точно не знаю пока, как правильно.

Answer 1

Не слишком эффективно, зато удобно, что в одну строку

File.WriteAllText("array.txt", string.Concat(array.Cast<string>().Select((s, i) => s + ((i+1) % array.GetLength(1) == 0 ? "\n" : " "))));

Код полностью: https://ideone.com/eyPvJM

using System;
using System.Linq;
public class Test
{
  static void Main(string[] args)
  {
    string[,] array = { { "aaa", "bbb", "ccc" }, { "q", "w", "e" } };
    //System.IO.File.WriteAllText("array.txt",
    Console.Write(
      string.Concat(array.Cast<string>().Select(
        (s, i) => s + ((i+1) % array.GetLength(1) == 0 ? "\n" : " ")
      ))
    );
  }
}
Answer 2
static void Main(string[] args)
{
    string[,] array =
    {
        { "а", "б", "в"},
        { "г", "д", "е"}
    };
    string fileName = @"D:\array.txt";
    WriteToFile(array, fileName);
    Console.ReadLine();
}
private static void WriteToFile(string[,] array, string fileName)
{
    StringBuilder output = new StringBuilder();
    for (int row = 0; row < array.GetLength(0); row++)
    {
        for (int column = 0; column < array.GetLength(1); column++)
        {
            output.Append($"{array[row, column]}|");
        }
        output.Append(Environment.NewLine);
    }
    try
    {
        System.IO.File.WriteAllText(fileName, output.ToString());
    }
    catch (Exception ex)
    {
        Debug.WriteLine($"<--Ошибка записи в файл: {ex.Message}");
    }
}
Answer 3

Подключаете к проекту nuget-пакет Json.Net.

Пишете:

File.WriteAllText(filename, JsonConvert.SerializeObject(arr));

arr - ваш массив.

Не забудьте указать пространства имён:

using Newtonsoft.Json;
using System.IO;
Answer 4

Еще один вариант для любителей Linq, должен быть более эффективен, чем в этом ответе за счет отсутствия сложения строк, но более трешовый:

string[,] array = { { "aaa", "bbb", "ccc" }, { "q", "w", "e" } };
Console.WriteLine(
    string.Join("\n",
                Enumerable.Range(0, array.GetLength(0))
                          .Select(y => string.Join(" ",
                                                   Enumerable.Range(0, array.GetLength(1))
                                                             .Select(x => array[y, x]))))
);

Идея заключается в том, что с помощью генераторов Enumerable.Range мы получаем все пары индексов массива, а потом по ним собираем строки с помощью string.Join.

Никогда так не пишите!

READ ALSO
Работа с ComboBox в потоке

Работа с ComboBox в потоке

Здравствуйте! При попытке установить ValueMember для ComboBox в потоке получаю следующую ошибку:

224
EntityFarmeworkCore абстрактный слой доступа к данным

EntityFarmeworkCore абстрактный слой доступа к данным

Здравсвуйте, хотелось создать абстрактный слой доступа к данным используя проекты типа NetStandart 20

296
Не работает JQuery в проекте ASP.NET

Не работает JQuery в проекте ASP.NET

Есть Html-хелпер, который генерирует элемент input

258