Comment créer une chaîne à partir d'une ligne d'un tableau de caractères rectangulaire à deux dimensions en C #?

StackOverflow https://stackoverflow.com/questions/194247

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?

Était-ce utile?

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());
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top