Como faço para criar uma cadeia de uma linha de uma matriz de caracteres bidimensional retangular em C #?

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

Pergunta

Eu tenho uma matriz dimensional 2, assim:

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

Agora, depois de eu ter armazenado conteúdos em ambos str [0] e str [1], como faço para armazená-lo em um

string[] s = new string[2];

?

Eu tentei

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

mas que parece ser um erro: 'dois' índices VC # espera dentro das chaves, o que significa que eu posso converter apenas um personagem a partir da matriz. Existe uma maneira de converter todo o str [0] para uma string? Ou está mudando para uma matriz denteada a única solução?

Foi útil?

Solução

A matriz denteada é quase sempre a melhor solução para uma variedade de razões, e este é um bom exemplo. Há muito mais flexibilidade disponíveis com uma variedade de matrizes do que com uma matriz multi-dimensional. Neste caso, uma vez que você tem os valores em uma matriz de caracteres, em seguida, um construtor na classe string pode ser usado para criar uma string a partir dele.

Além disso, a matriz denteada seria composto por "vectores" (isto é, uma única dimensão matrizes com um índice zero limite inferior), que são muito mais promoção em Net porque eles recebem um tratamento especial pelo CLR .

Assim, sem saber o que o resto do seu programa está fazendo, que seria a minha recomendação.

Se você tentar construir uma corda manualmente por looping através dos índices de matriz, em vez de usar uma matriz denteada, então eu recomendo usar a classe StringBuilder para fazê-lo.

Eu apenas bati isso, mas deve ser algo como isto:

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

Outras dicas

Assumindo que as dimensões são fixadas como se 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];

Este seria mais fácil e mais performance se você usou um array irregular:

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

Em seguida, você poderia escrever:

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

Eu concordo com o uso de uma matriz irregulares. Você pode usar esse método auxiliar para inicializar uma matriz irregulares:

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

Assim

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

se tornaria

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

Você iria elementos, em seguida, de acesso em-lo assim

str[0, 10] = 'a';

E para torná-lo uma corda que você faria

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

Você pode fazê-lo com 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());
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top