2014-10-30 13 views
5

Jestem nowy w programowaniu. Uczę się C# przez Bob Tabors filmy na kanale 9.Dlaczego Array.Reverse (myCharArray), a nie myCharArray = myCharArray.Reverse?

Czy możesz wyjaśnić, dlaczego nie możemy zrobić coś takiego:

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

zamiast tego:

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

Innym powodem jest to, że w sugerowanym zamienniku jest zwracana zmodyfikowana kopia tablicy (prawdopodobnie pozostawiając oryginalną tablicę nietkniętą). To byłoby droższe. Jednak jest to dobre pytanie, dlaczego nie ma metody "public void Reverse()". – user469104

+0

Można użyć metody rozszerzenia 'Odwróć' http://msdn.microsoft.com/library/vstudio/bb358497.aspx –

+0

Należy również pamiętać, że przed odwrotnością nie ma potrzeby funkcji ToCharArray, ciąg jest już licznikiem IEnumerable IntelliSense ukrywa autouzupełnianie linq dla ciągów znaków, aby uniknąć missuse –

Odpowiedz

1

Można faktycznie jeśli używasz System.Linq, ale jest to metoda rozszerzenia dla IEnumerable.

+0

'char []' jest 'IEnumerable '. –

3

Ponieważ pierwsza używa metody z rozszerzeniem Reverse, która zwraca IEnumerable<char> zamiast char[]. Więc można zrobić ...

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

ale który byłby mniej skuteczny niż Array.Reverse ponieważ ma stworzyć nową tablicę i nie zna ostatecznej wielkości wcześniej.

4

Możesz zrobić jedno i drugie.

Najpierw wykonywane przy użyciu LINQ, tworzy nową sekwencję:

using System.Linq; 

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

drugie wprowadza zmiany w miejscu, jest zoptymalizowany i bardziej efektywne:

Array.Reverse(mijnCharArray); 

wybór należy do ciebie, zależy od scenariusz użycia.

1

Nie można użyć metody Reverse przedłużacz od Reverse() zwrotów IEnumerable<char>, co nie jest char[]. Musisz rzucić IEnumerable<char> do tablicy. Tak działa to na przykład:

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

Można użyć Reverse na string za pomocą tej metody rozszerzenie:

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

Następnie wystarczy zadzwonić:

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

Tak, 'char []' * nie * implementuje 'IEnumerable': http://msdn.microsoft.com/en-us/library/system.array.aspx - Działa:' "test" .ToCharArray() .Reverse(). ToArray() ' –

+0

@StephanBauer: Masz rację, moje złe. Błędne odczytanie komunikatu o błędzie. –

+0

nie trzeba tworzyć nowego ciągu i wywoływać funkcję .ToArray(); po prostu użyj Concat: 'string odwróconyFirstName = string.Concat (mijnVoornaam.Reverse())'; –

3

rzeczywistości; możesz.

.Reverse jest metodą rozszerzenia LINQ i zwraca wartość IEnumerable<T>, dlatego zadanie nie powiedzie się. Jeśli jednak to zrobisz:

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

Wszystko będzie dobrze. Zwróć uwagę, że to zwraca tablicę nowa z odwróconymi znakami.

Array.Reverse wykonuje zamianę w miejscu i zwraca void i nie można przypisać wyniku.

Powiązane problemy