Преобразовать многомерный массив в строку - PullRequest
0 голосов
/ 08 сентября 2018

У меня есть 3-х мерный массив символов, инициализированный так:

char[,,] cube = new char[10, 10, 10];

Он полностью заполнен, и я хочу преобразовать его содержимое в одну строку. Мой текущий метод таков:

for (int z = 0; z < 10; z++) {
    for (int y = 0; y < 10; y++) {
        for (int x = 0; x < 10; x++) {
            build += cube[z, y, x];
        }
    }
}

Попытка сделать build = new string(cube) выдает ошибку:
cannot convert from 'char[*,*,*]' to 'char*'

Циклы for невероятно быстрые, заканчивая менее чем за миллисекунду в моей установке (от 1500 до 4000 тиков). Хотите знать, если существует однострочный метод, который будет выполнять то же самое, что и эти вложенные циклы for?

EDIT:
Этот код будет использоваться только один раз во всей программе, поэтому мне не нужно что-то повторно использовать.

Ответы [ 4 ]

0 голосов
/ 08 сентября 2018
string build = string.Concat(cube.Cast<char>());

Вероятно, не требуется в вашем случае, но гораздо более быстрой альтернативой является копирование в char[]:

//var cube = new[, ,] { { { 'a', 'b' }, { 'c', 'd' } }, { { 'e', 'f' }, { 'g', 'h' } } };
char[] temp = new char[cube.Length];
Buffer.BlockCopy(cube, 0, temp, 0, temp.Length * sizeof(char));
string build = new string(temp);
0 голосов
/ 08 сентября 2018

LINQ - твой друг.

В многомерном массиве реализовано IEnumerable, но, к сожалению, очевидно, что нет IEnumerable<T>. Итак, сначала нам нужно получить IEnumerable<T>, чтобы можно было в полной мере использовать LINQ. К счастью, в этом случае мы знаем, что каждый элемент в этом многомерном массиве имеет тип char, нам просто нужно сообщить об этом компилятору.

Далее, для создания string, существует удобный конструктор, который принимает char[]. И получить char[] от IEnumerable<char> - это всего лишь один ToArray().

Соедините это, и вы получите:

using System.Linq;

var build = new string(cube.OfType<char>().ToArray());
0 голосов
/ 08 сентября 2018
char[,,] cube = new char[10, 10, 10];
                for (int z = 0; z < 10; z++)
                {
                    for (int y = 0; y < 10; y++)
                    {
                        for (int x = 0; x < 10; x++)
                        {
                            cube[z, y, x] = (char)(65+x);
                        }
                    }
                }
/* Just Filling data in array*/    
                var s1 = cube.OfType<char>().ToList();
                string s = string.Join("",s1);
0 голосов
/ 08 сентября 2018

Это проще, чем вы думаете:

public static String FlattenToString(this char[,,] array)
{
    var builder = new StringBuilder();

    foreach(var @char in array)
    {
        builder.Append(@char);
    }

    return builder.ToString();
}

var cube = new char[2,2,2];

cube[0,0,0] = 'a';
cube[0,0,1] = 'b';
cube[0,1,0] = 'c';
cube[0,1,1] = 'd';
cube[1,0,0] = 'e';
cube[1,0,1] = 'f';
cube[1,1,0] = 'g';
cube[1,1,1] = 'h';

Console.WriteLine(cube.FlattenToString());

Распечатывает abcdefgh.

...