Come faccio a creare una stringa da una riga di una matrice di caratteri rettangolare bidimensionale in C #?

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

Domanda

Ho un array bidimensionale, in questo modo:

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

Ora, dopo che ho archiviato i contenuti sia in str [0] che in str [1], come posso archiviarli in un

string[] s = new string[2];

Ho provato

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

ma questo sembra essere un errore: VC # prevede "due" indici tra parentesi graffe, il che significa che posso convertire solo un carattere dall'array. C'è un modo per convertire l'intero str [0] in una stringa? O è cambiarlo in un array frastagliato l'unica soluzione?

È stato utile?

Soluzione

Un array frastagliato è quasi sempre la soluzione migliore per una serie di motivi, e questo è un buon esempio. C'è molta più flessibilità disponibile con una matrice di array che con una matrice multidimensionale. In questo caso, una volta che hai i valori in una matrice di caratteri, puoi usare un costruttore sulla classe stringa per creare una stringa da essa.

Inoltre, l'array frastagliato sarebbe composto da " vettori " (vale a dire, un array monodimensionale con un indice zero-bound inferiore), che sono molto più preferibili in .Net perché ricevono un trattamento speciale dal CLR.

Quindi, senza sapere cosa sta facendo il resto del tuo programma, questa sarebbe la mia raccomandazione.

Se si tenta di costruire manualmente una stringa eseguendo il ciclo attraverso gli indici dell'array, anziché utilizzare un array frastagliato, si consiglia di utilizzare la classe StringBuilder per farlo.

L'ho appena sbattuto fuori, ma dovrebbe essere qualcosa del genere:

// 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]);

Altri suggerimenti

Supponendo che le dimensioni siano fisse come 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];

Questo sarebbe più facile e più performante se si usasse un array frastagliato:

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

Quindi potresti scrivere:

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

Concordo con l'uso di un array frastagliato. È possibile utilizzare questo metodo di supporto per inizializzare un array frastagliato:

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];

diventerebbe

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

Dovresti quindi accedere agli elementi in questo modo

str[0, 10] = 'a';

E per renderlo una stringa faresti

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

Puoi farlo con 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());
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top