Wie schaffe ich eine Zeichenfolge aus einer Reihe einer zweidimensionalen rechteckigen Zeichenfeldes in C #?

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

Frage

Ich habe einen 2-dimensionalen Array, etwa so:

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

Nun, nachdem ich gespeicherten Inhalte sowohl in str [0] und str [1], wie lagere ich es in einem

string[] s = new string[2];

Ich habe versucht,

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

, aber das scheint ein Fehler zu sein: VC # erwartet ‚zwei‘ Indizes innerhalb der geschweiften Klammern, die bedeuten, dass ich nur ein Zeichen aus dem Array umwandeln kann. Gibt es eine Möglichkeit, die gesamte str [0] in eine Zeichenfolge zu konvertieren? Oder ist es zu einem gezackten Array die einzige Lösung zu ändern?

War es hilfreich?

Lösung

Ein gezackter Array ist fast immer die beste Lösung für eine Vielzahl von Gründen, und dies ist ein gutes Beispiel dafür. Es gibt so viel mehr Flexibilität zur Verfügung mit einer Reihe von Arrays als mit einem mehrdimensionalen Array. In diesem Fall, wenn Sie die Werte in einem Array von Zeichen haben, dann kann ein Konstruktor auf der String-Klasse verwendet werden, um eine Zeichenfolge von ihm zu erstellen.

Auch würde die gezackten Array von „Vektoren“ zusammengesetzt sein (dh eine eindimensionale Arrays mit einer Null-Untergrenze-Index), die viel mehr Vorteig in NET sind, weil sie eine besondere Behandlung der CLR gegeben .

Also, ohne zu wissen, was der Rest des Programms tut, dass meine Empfehlung wäre.

Wenn Sie mit dem Schleifen durch den Array-Indizes eine Zeichenfolge manuell zu konstruieren versuchen, stattdessen einen gezackten Array zu verwenden, dann empfehle ich die Klasse String verwenden, es zu tun.

ich dies nur knallte, aber es sollte wie folgt sein:

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

Andere Tipps

, die Abmessungen der Annahme festgelegt sind als 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];

Das wäre einfacher und performant, wenn Sie einen gezackten Array verwendet:

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

Dann könnte man schreiben:

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

Ich würde zustimmen, eine gezackte Array mit verwenden. Sie können diese Hilfsmethode verwenden, um ein verzweigtes Array zu initialisieren:

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

würde

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

Sie würden dann Elemente zugreifen darin wie so

str[0, 10] = 'a';

Und es um eine Zeichenfolge machen Sie tun würden,

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

Sie können es mit LINQ tun:

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());
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top