2014-10-30 20 views
5

Tôi mới tham gia lập trình. Tôi đang học C# qua video Bob Tabors trên kênh 9.Tại sao Array.Reverse (myCharArray) và không phải myCharArray = myCharArray.Reverse?

bạn có thể giải thích lý do tại sao chúng ta không thể làm điều gì đó như thế này:

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

thay vì điều này:

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

Một lý do khác là trong phương án thay thế được đề xuất của bạn, bản sao sửa đổi của mảng được trả về (có lẽ để nguyên mảng ban đầu bị ảnh hưởng). Điều này sẽ đắt hơn. Tuy nhiên, đây là một câu hỏi hay là tại sao không có phương thức 'void void Reverse()'. – user469104

+0

Bạn có thể sử dụng phương pháp mở rộng 'Đảo ngược 'http://msdn.microsoft.com/library/vstudio/bb358497.aspx –

+0

Cũng lưu ý rằng bạn không cần phải ToCharArray trước khi đảo ngược, một chuỗi đã là một IEnumerable IntelliSense ẩn tự động hoàn thành LINQ cho các chuỗi để tránh thiếu sót –

Trả lời

1

Bạn thực sự có thể làm nếu bạn sử dụng System.Linq, nhưng đó là một phương pháp mở rộng cho IEnumerable.

+0

'char []' là 'IEnumerable '. –

3

Vì lần đầu tiên sử dụng phương pháp mở rộng LINQReverse trả về một IEnumerable<char> thay vì char[]. Vì vậy, bạn có thể làm ...

nhưng điều đó sẽ kém hiệu quả hơn Array.Reverse vì nó phải tạo mảng mới và không biết kích thước cuối cùng trước đó.

4

Bạn có thể làm cả hai.

Đầu tiên nó thực hiện bằng LINQ, nó tạo ra một chuỗi mới:

using System.Linq; 

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

Thứ hai làm cho những thay đổi tại chỗ, được tối ưu hóa và hiệu quả hơn:

Array.Reverse(mijnCharArray); 

Sự lựa chọn là của bạn, phụ thuộc vào bạn kịch bản sử dụng.

1

Bạn không thể sử dụng phương thức mở rộng Reverse kể từ Reverse() trả lại IEnumerable<char>, không phải là char[]. Bạn phải đúc IEnumerable<char> vào một mảng. Vì vậy, các công trình này ví dụ:

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

Bạn có thể sử dụng Reverse trên string quá với phương pháp mở rộng này:

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

Sau đó, chỉ cần gọi:

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

Có, 'char []' * hiện * thực hiện 'IEnumerable': http://msdn.microsoft.com/en-us/library/system.array.aspx - Điều này đang hoạt động:' "test". ToCharArray() .Reverse() ToArray() ' –

+0

@StephanBauer: Bạn nói đúng, xấu của tôi. Đã đọc sai thông báo lỗi. –

+0

không cần tạo chuỗi mới và gọi .ToArray(); chỉ cần sử dụng Concat: 'string reversedFirstName = string.Concat (mijnVoornaam.Reverse())'; –

3

Trên thực tế; bạn có thể.

.Reverse là phương pháp tiện ích LINQ và trả lại số IEnumerable<T> đó là lý do tại sao bài tập không thành công. Tuy nhiên, nếu bạn đã làm điều này:

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

Nó sẽ chỉ làm việc tốt. Lưu ý rằng điều này trả về một mảng mới với các ký tự được đảo ngược.

Array.Reverse thực hiện đảo ngược tại chỗ và trả về void và bạn không thể chỉ định kết quả.

Các vấn đề liên quan