Comment créer une chaîne à partir d'une ligne d'un tableau de caractères rectangulaire à deux dimensions en C #?
-
10-07-2019 - |
Question
J'ai un tableau en 2 dimensions, comme suit:
char[,] str = new char[2,50];
Maintenant, après avoir stocké le contenu dans str [0] et str [1], comment le stocker dans un
string[] s = new string[2];
?
j'ai essayé
s[0] = str[0].ToString();
mais cela semble être une erreur: VC # attend deux index entre les accolades, ce qui signifie que je ne peux convertir qu'un caractère du tableau. Existe-t-il un moyen de convertir l'intégralité de str [0] en chaîne? Ou est-ce que le changer en tableau en dents de scie est la seule solution?
La solution
Un tableau dentelé est presque toujours la meilleure solution pour diverses raisons, et ceci en est un bon exemple. Il y a tellement plus de flexibilité disponible avec un tableau de tableaux qu'avec un tableau multidimensionnel. Dans ce cas, une fois que vous avez les valeurs dans un tableau de caractères, vous pouvez utiliser un constructeur de la classe string pour créer une chaîne à partir de celle-ci.
De plus, le tableau dentelé serait composé de "vecteurs". (c'est-à-dire des tableaux unidimensionnels avec un indice égal à zéro), qui sont beaucoup plus avantageux dans .Net car ils bénéficient d'un traitement spécial de la part du CLR.
Donc, sans savoir ce que le reste de votre programme fait, ce serait ma recommandation.
Si vous essayez de construire une chaîne manuellement en parcourant les index du tableau, au lieu d'utiliser un tableau en escalier, je vous recommande d'utiliser la classe StringBuilder pour le faire.
Je viens de casser ça, mais ça devrait être quelque chose comme ça:
// 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]);
Autres conseils
En supposant que les dimensions sont fixées à 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];
Cela serait plus facile et plus performant si vous utilisiez un tableau dentelé:
char[][] str = new char[2][];
Ensuite, vous pouvez écrire:
string s = new string(characters[0]);
Je serais d'accord avec l'utilisation d'un tableau en dents de scie. Vous pouvez utiliser cette méthode d'assistance pour initialiser un tableau irrégulier:
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;
}
Alors
char[,] str = new char[2,50];
deviendrait
char[][] str = ArrayHelper.InitJaggedArray<char>(2, 50);
Vous accéderiez alors à des éléments comme si
str[0, 10] = 'a';
Et pour en faire une chaîne, vous feriez
string s = new string(str[0]);
Vous pouvez le faire avec 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());
}