2014-10-30 6 views
5

Ich bin neu in der Programmierung. Ich lerne C# durch Bob Tabors Videos auf Channel 9.Warum Array.Reverse (myCharArray) und nicht myCharArray = myCharArray.Reverse?

Können Sie erklären, warum wir nicht so etwas tun kann:

string mijnVoornaam = "Remolino"; 
char[] mijnCharArray = mijnVoornaam.ToCharArray(); 
mijnCharArray = mijnCharArray.Reverse(); 

statt dessen:

string mijnVoornaam = "Remolino"; 
char[] mijnCharArray = mijnVoornaam.ToCharArray(); 
Array.Reverse(mijnCharArray); 
+0

Ein weiterer Grund ist, dass in Ihrer vorgeschlagenen Alternative eine modifizierte Kopie des Arrays zurückgegeben wird (vermutlich das ursprüngliche Array unberührt lassen). Das wäre teurer. Es ist jedoch eine gute Frage, warum es keine "public void Reverse()" Methode gibt. – user469104

+0

Sie könnten die Erweiterungsmethode 'Reverse' verwenden http://msdn.microsoft.com/library/vstudio/bb358497.aspx –

+0

Beachten Sie auch, dass Sie ToCharArray nicht vor dem Reverse benötigen, eine Zeichenfolge ist bereits ein IEnumerable IntelliSense nur blendet die linq-Autokomplettierung für Strings aus, um Missbräuche zu vermeiden –

Antwort

1

können Sie tatsächlich tun wenn Sie System.Linq verwenden, aber das ist eine Erweiterungsmethode für IEnumerable.

+0

'char []' ist 'IEnumerable '. –

3

Da die erste verwendet die LINQ Erweiterungsmethode Reverse, die eine IEnumerable<char> anstelle von char[] zurückgibt. So könnten Sie tun ...

mijnCharArray = mijnCharArray.Reverse().ToArray(); 

aber das wäre weniger effizient als Array.Reverse, da es ein neues Array erstellen hat, und es weiß nicht, die endgültige Größe vorher.

4

Sie können beides tun.

Zuerst es ausgeführt LINQ verwenden, ist es eine neue Sequenz erzeugt:

using System.Linq; 

mijnCharArray = mijnCharArray.Reverse().ToArray(); 

Zweitens macht Änderungen an Ort und Stelle, optimiert und effizienter:

Array.Reverse(mijnCharArray); 

Wahl liegt bei Ihnen, hängt von Ihrem Nutzungsszenario.

1

Sie können die Erweiterungsmethode Reverse nicht verwenden, da Reverse()IEnumerable<char> zurückgibt, was nicht char[] ist. Sie müssen die IEnumerable<char> in ein Array umwandeln. So funktioniert das zum Beispiel:

public static class ExtensionMethods 
{ 
    public static string Reverse(this string s) 
    { 
     return string.Concat(s.Reverse()); 
     // or: 
     // return new string(s.Reverse().ToArray()); 
    } 
} 

Dann rufen Sie einfach an:

char[] c = mijnVoornaam.Reverse().ToArray(); 

Sie Reverse auf string auch mit dieser Erweiterung Methode verwenden könnten

string reverse = "name".Reverse(); 
+0

Ja, 'char []' * implementiert * IEnumerable: http://msdn.microsoft.com/en-us/library/system.array.aspx - Dies funktioniert: '" test ".ToCharArray() .Reverse(). ToArray() ' –

+0

@StephanBauer: Du hast Recht, mein Schlechter. Die Fehlermeldung wurde falsch gelesen. –

+0

keine Notwendigkeit, eine neue Zeichenfolge zu erstellen und aufzurufen. ToArray(); benutze einfach Concat: 'string reversedFirstName = string.Concat (mijnVoornaam.Reverse())'; –

3

Eigentlich; Sie können.

.Reverse ist eine LINQ-Erweiterungsmethode und gibt IEnumerable<T> zurück, weshalb die Zuweisung fehlschlägt. Wenn Sie dies getan haben:

string mijnVoornaam = "Remolino"; 
char[] mijnCharArray = mijnVoornaam.ToCharArray(); 
mijnCharArray = mijnCharArray.Reverse().ToArray(); 

Es würde nur gut funktionieren. Beachten Sie, dass dies ein neues Array mit den umgekehrten Zeichen zurückgibt.

Array.Reverse führt eine direkte Umkehrung durch und gibt daher void zurück, und Sie können das Ergebnis nicht zuweisen.