Как создать строку из одной строки двумерного прямоугольного массива символов в C #? - PullRequest
1 голос
/ 11 октября 2008

У меня есть двумерный массив, например:

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

Теперь, после того как я сохранил содержимое как в str [0], так и в str [1], как мне сохранить его в

string[] s = new string[2];

Я пытался

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

но это кажется ошибкой: VC # ожидает, что в фигурных скобках есть «два» индекса, что означает, что я могу преобразовать только символ из массива. Есть ли способ преобразовать всю строку [0] в строку? Или единственное решение - заменить его на зубчатый массив?

Ответы [ 4 ]

3 голосов
/ 11 октября 2008

Зубчатый массив почти всегда является лучшим решением по разным причинам, и это один хороший пример. Для массива массивов гораздо больше гибкости, чем для многомерного массива. В этом случае, если у вас есть значения в массиве символов, конструктор класса string можно использовать для создания строки из него.

Кроме того, зубчатый массив будет состоять из «векторов» (то есть одномерных массивов с индексом с нулевым нижним пределом), которые являются гораздо более предпочтительными в .Net, поскольку CLR уделяет им особое внимание .

Так что, не зная, что делает остальная часть вашей программы, это было бы моей рекомендацией.

Если вы попытаетесь создать строку вручную с помощью циклического перемещения по индексам массива вместо использования зубчатого массива, я рекомендую использовать класс 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]);
2 голосов
/ 11 октября 2008

При условии, что размеры зафиксированы как 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]);
1 голос
/ 11 октября 2008

Я бы согласился с использованием зубчатого массива. Вы можете использовать этот вспомогательный метод для инициализации зубчатого массива:

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

So

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

станет

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

Вы бы тогда получили доступ к элементам в нем, как это

str[0, 10] = 'a';

И чтобы сделать это строкой, вы должны сделать

string s = new string(str[0]);
0 голосов
/ 15 июля 2012

Вы можете сделать это с помощью 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());
}
...