如何在 C# 中从二维矩形字符数组的一行创建字符串?

Posted

技术标签:

【中文标题】如何在 C# 中从二维矩形字符数组的一行创建字符串?【英文标题】:How do I create a string from one row of a two dimensional rectangular character array in C#? 【发布时间】:2010-09-16 16:37:48 【问题描述】:

我有一个二维数组,如下所示:

char[,] str = new char[2,50];

现在,在我将内容存储在 str[0] 和 str[1] 中之后,如何将其存储在一个

string[] s = new string[2];

?

我试过了

s[0] = str[0].ToString();

但这似乎是一个错误:VC# 需要大括号内的“两个”索引,这意味着我只能转换数组中的一个字符。有没有办法将整个 str[0] 转换为字符串?还是将其更改为锯齿状数组是唯一的解决方案?

【问题讨论】:

嗨,我发布了但没有注意数组类型。稍后我会再次发布一些代码。 我还建议将此问题的标题更改为问题。例如,“如何从二维矩形字符数组的一行创建字符串?”。 谢谢...我意识到标题措辞完美,但当时想不出更好的。谢谢你的推荐。 :) 【参考方案1】:

由于各种原因,锯齿状数组几乎总是最好的解决方案,这是一个很好的例子。与多维数组相比,数组数组具有更大的灵活性。在这种情况下,一旦你在一个字符数组中获得了值,那么字符串类的构造函数就可以用来从它创建一个字符串。

此外,锯齿状数组将由“向量”(即,下界索引为零的一维数组)组成,这在 .Net 中更受欢迎,因为 CLR 对它们进行了特殊处理.

因此,在不知道程序的其余部分在做什么的情况下,这是我的建议。

如果您确实尝试通过循环遍历数组索引来手动构造字符串,而不是使用锯齿状数组,那么我建议使用 StringBuilder 类来完成。

我刚刚敲了这个,但它应该是这样的:

// For the multi-dimentional array
StringBuilder sb = new StringBuilder();
for (int stringIndex = 0; stringIndex < s.Length; stringIndex++)

  sb.Clear();
  for (int charIndex = 0; charIndex < str.UpperBound(1); charIndex++)
    sb.Append(str[stringIndex,charIndex]);
  s[stringIndex] = sb.ToString();


// For the jagged array
for (int index = 0; index < s.Length; index++)
  s[index] = new string(str[index]);

【讨论】:

谢谢...我不需要使用矩形数组,因此与简单地切换到锯齿状数组相比,使用 StringBuilder 是不必要的复杂性。基于这一点和您的其他观点,我选择了后一种解决方案。再次感谢。【参考方案2】:

假设尺寸固定为 2x50:

char[,] str = new char[2,50];

// populate str somehow

// chose which of the strings we want (the 'row' index)
int strIndex = 0;
// create a temporary array (faster and less wasteful than using a StringBuilder)
char[] chars = new chars[50];
for (int i = 0; i < 50; i++)
  chars[i] = str[strIndex, i];
string s = new string[chars];

如果您使用锯齿状数组,这将更容易且性能更高:

char[][] str = new char[2][];

那么你可以写:

string s = new string(characters[0]);

【讨论】:

【参考方案3】:

我同意使用锯齿状数组。你可以使用这个辅助方法来初始化一个交错数组:

static T[][] InitJaggedArray<T>(int dimension1, int dimension2)

    T[][] array = new T[dimension1][];
    for (int i = 0; i < dimension1; i += 1)
    
        array[i] = new T[dimension2];
    
    return array;

所以

char[,] str = new char[2,50];

会变成

char[][] str = ArrayHelper.InitJaggedArray<char>(2, 50);

然后您可以像这样访问其中的元素

str[0, 10] = 'a';

为了让它成为你会做的字符串

string s = new string(str[0]);

【讨论】:

【参考方案4】:

你可以用 LINQ 做到这一点:

string[] Convert(char[,] chars)

    return Enumerable.Range(0, chars.GetLength(1))
                     .Select(i => Enumerable.Range(0, chars.GetLength(0))
                                            .Select(j => chars[j, i]))
                     .Select(chars => new string(chars.ToArray());

【讨论】:

以上是关于如何在 C# 中从二维矩形字符数组的一行创建字符串?的主要内容,如果未能解决你的问题,请参考以下文章

C#:如何将多个字符串拆分为二维数组?

如何在托管代码(C#)中从本机代码(C++)获取字符串数组

检查二维数组c#中的某些元素是不是相等

c语言二维数组里的数据如何让两行字符转换为一行字符

C中如何实现数组的传值引用

在 Bash 中从文本文件创建数组