gpt4 book ai didi

c# - 在C#中将二维数组转换为字符串,寻找最优雅的方式

转载 作者:行者123 更新时间:2023-11-30 20:17:02 30 4
gpt4 key购买 nike

我不敢相信没有聪明的方法可以从二维数组中获取这样的东西,
在本例中 int[,] a:

"{1,2,3},{4,5,6},{7,8,9}"

我读过很多类似的问题,并了解到 string.Join() 只能用于锯齿状数组(二维)。但我不想使用它们,因为初始化更复杂,而且当我的行(全部具有相同的长度)分布在内存中的多个位置时,感觉很糟糕。

这是我的“正常”代码:

var s = "";
for (int i = 0; i < a.GetLength(0); i++) {
if (i > 0) s += ',';
s += '{';
for (int j = 0; j < a.GetLength(1); j++) {
if (j > 0) s += ',';
s += a[i, j];
}
s += '}';
}

这是一个“打高尔夫球”的:

var s = "{";
var i = 0;
foreach (var item in a) s += (i++ > 0 ? i % a.GetLength(1) == 1 ? "},{" : "," : "") + item;
s += '}';

:) - 也不是很优雅,而且可读性非常差。

有什么建议吗?我对 Linq 持开放态度,因为它不必很快。我对提高代码的优雅性感兴趣,但不仅仅是将其移动到扩展方法。

最佳答案

据我所知,当我们想要来自对象的字符串时,我们正在调用序列化,所以我更喜欢使用像 Newtonsoft.Json 这样的序列化程序:

var result = $@"{{{JsonConvert.SerializeObject(a)
.Trim('[', ']').Replace("[", "{").Replace("]", "}")}}}";

使用简单的for(如您的解决方案)并删除if的方法可以是 - this code will be faster for small arrays -:

var result = string.Empty;
var maxI = a.GetLength(0);
var maxJ = a.GetLength(1);
for (var i = 0; i < maxI; i++)
{
result += ",{";
for (var j = 0; j < maxJ; j++)
{
result += $"{a[i, j]},";
}

result += "}";
}

result = .Replace(",}", "}").Substring(1);

建议使用 StringBuilder 来提高大数组的性能:

var sb = new StringBuilder(string.Empty);
var maxI = a.GetLength(0);
var maxJ = a.GetLength(1);
for (var i = 0; i < maxI; i++)
{
sb.Append(",{");
for (var j = 0; j < maxJ; j++)
{
sb.Append($"{a[i, j]},");
}

sb.Append("}");
}

sb.Replace(",}", "}").Remove(0, 1);
var result = sb.ToString();

关于c# - 在C#中将二维数组转换为字符串,寻找最优雅的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46630565/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com