我有一个这样初始化的3维char数组:
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
循环所完成的工作吗?
编辑:
该代码在整个程序中只会使用一次,因此我不需要任何可重用的东西。
答案 0 :(得分:3)
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());
答案 1 :(得分:2)
这比您想象的要容易:
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
。
答案 2 :(得分:2)
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);
答案 3 :(得分:1)
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);