C#で2次元の長方形の文字配列の1行から文字列を作成するにはどうすればよいですか?
-
10-07-2019 - |
質問
次のような2次元配列があります:
char[,] str = new char[2,50];
今、str [0]とstr [1]の両方にコンテンツを保存した後、どのように保存しますか
string[] s = new string[2];
?
試しました
s[0] = str[0].ToString();
しかしそれはエラーのようです:VC#は中括弧内に '2'のインデックスを期待しています。つまり、配列の文字のみを変換できます。 str [0]全体を文字列に変換する方法はありますか?または、それをギザギザの配列に変更することが唯一の解決策ですか?
解決
さまざまな理由から、ほとんどの場合、ギザギザの配列が最適なソリューションです。これは良い例です。多次元配列よりも配列の配列の方がはるかに柔軟性があります。この場合、文字の配列に値を設定したら、文字列クラスのコンストラクターを使用して、そこから文字列を作成できます。
また、ギザギザの配列は「ベクター」で構成されます。 (つまり、ゼロ下限バインドインデックスを持つ1次元配列)。これらはCLRによって特別な処理が行われるため、.Netでより優先されます。
だから、あなたのプログラムの残りの部分が何をしているのか分からないなら、それが私の推薦でしょう。
ギザギザの配列を使用する代わりに、配列インデックスをループして文字列を手動で作成しようとする場合は、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]);
他のヒント
寸法が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]);
ギザギザの配列を使用することに同意します。このヘルパーメソッドを使用して、ギザギザの配列を初期化できます。
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]);
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());
}