将2D数组转换为C#中的字符串,寻找最优雅的方式

将2D数组转换为C#中的字符串,寻找最优雅的方式,c#,arrays,linq,multidimensional-array,tostring,C#,Arrays,Linq,Multidimensional Array,Tostring,我不敢相信,没有聪明的方法可以从2D阵列中获得这样的东西, 在这种情况下,int[,]a: "{1,2,3},{4,5,6},{7,8,9}" 我读过许多类似的问题,了解到string.Join()只能用于锯齿状数组(在2D中)。但是我不想使用它们,因为初始化比较复杂,而且当我的行(所有行都有相同的长度)分布在内存中的几个地方时,感觉很糟糕 这是我的“正常”代码: :)-也不是很优雅,可读性也很差 有什么建议吗?我对Linq很开放,因为它不需要很快。我对改进代码的优雅感兴趣,但不仅仅是将其移动

我不敢相信,没有聪明的方法可以从2D阵列中获得这样的东西,
在这种情况下,
int[,]a

"{1,2,3},{4,5,6},{7,8,9}"
我读过许多类似的问题,了解到
string.Join()
只能用于锯齿状数组(在2D中)。但是我不想使用它们,因为初始化比较复杂,而且当我的行(所有行都有相同的长度)分布在内存中的几个地方时,感觉很糟糕

这是我的“正常”代码:

:)-也不是很优雅,可读性也很差


有什么建议吗?我对Linq很开放,因为它不需要很快。我对改进代码的优雅感兴趣,但不仅仅是将其移动到扩展方法。

考虑这种方法:

var numbers = new int[,] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };

var results = string.Join(",",
    Enumerable.Range(0, numbers.GetUpperBound(0) + 1)
        .Select(x => Enumerable.Range(0, numbers.GetUpperBound(1) + 1)
            .Select(y => numbers[x, y]))
        .Select(z => "{" + string.Join(",", z) + "}"));

Console.WriteLine(results);

Console.ReadLine();

它与您的非常相似,但使用LINQ代替。它将二维数组投影到LINQ可枚举项中,然后用大括号将其包装,并在需要时添加逗号。

LINQ解决方案,而不是性能方面的解决方案

var str = string.Join(",", a.OfType<int>()
    .Select((value, index) => new {value, index})
    .GroupBy(x => x.index / a.GetLength(1))
    .Select(x => $"{{{string.Join(",", x.Select(y => y.value))}}}"));

好的,当我们需要一个对象的字符串时,我们调用的是序列化,所以我更喜欢使用像Newtonsoft.Json这样的序列化程序:


使用简单的
for
s(如您的解决方案)和删除
if
s的方法可以是--:


发布这个答案只是为了参考,当你不介意数据以连续的方式呈现时,当边界是静态的并且总是已知的时候

您可以使用LINQ
Cast
,然后使用
string.Join
将字符串输出为纯csv

var array = new int[2,3] { { 1, 2, 3 }, { 1, 2, 3 } };
var output = string.Join(',', array.Cast<int>());
var数组=newint[2,3]{{1,2,3},{1,2,3};
var output=string.Join(',',array.Cast());
要重新分析它,请执行以下操作:

var input = new int[upperLen,lowerLen];
for (var upper = 0; upper < upperLen; upper++)
    for(var lower = 0; lower < lowerLen; lower++)
        input[upper, lower] = int.Parse(parsed[(upper * lowerLen) + lower]);
var输入=新整数[upperLen,lowerLen];
对于(变量上限=0;上限<上限;上限++)
对于(var lower=0;lower

参见示例。

这不符合要求,或者您对这些要求的解释过于宽泛。它不是关于能够解析它,而是关于以结构化的方式呈现数据。
var str = string.Join(",", a.OfType<int>()
    .Select((value, index) => new {value, index})
    .GroupBy(x => x.index / a.GetLength(1), x => x.value,
        (i, ints) => $"{{{string.Join(",", ints)}}}"));
var result = $@"{{{JsonConvert.SerializeObject(a)
    .Trim('[', ']').Replace("[", "{").Replace("]", "}")}}}";
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);
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();
var array = new int[2,3] { { 1, 2, 3 }, { 1, 2, 3 } };
var output = string.Join(',', array.Cast<int>());
var input = new int[upperLen,lowerLen];
for (var upper = 0; upper < upperLen; upper++)
    for(var lower = 0; lower < lowerLen; lower++)
        input[upper, lower] = int.Parse(parsed[(upper * lowerLen) + lower]);