2013-06-01 17 views
10

Điều này có thể đã được hỏi trước đây, nhưng tôi không thể tìm thấy bất kỳ bài đăng nào như vậy. Có một lớp học để làm việc với ASCII Strings? Những lợi ích rất nhiều:Lớp chuỗi ASCII nhanh và bộ nhớ hiệu quả cho .NET

  1. So sánh nên nhanh hơn kể từ chỉ byte-cho-byte (thay vì UTF-8 với mã hóa biến)
  2. Memory hiệu quả, nó nên sử dụng khoảng một nửa bộ nhớ trong chuỗi lớn
  3. phiên bản nhanh hơn của ToUpper()/ToLower() mà sử dụng một Look-Up-Table đó là ngôn ngữ bất biến

Jon Skeet đã viết một bản AsciiString implementation và chứng minh # 2, nhưng tôi đang tự hỏi nếu có ai mất thêm này và hoàn thành một lớp học như vậy. Tôi chắc chắn sẽ có sử dụng, mặc dù không có ai thường sẽ có một tuyến đường như vậy kể từ khi tất cả các chức năng String hiện có sẽ phải được thực hiện lại bằng tay. Và chuyển đổi giữa chuỗi <> AsciiString sẽ nằm rải rác ở khắp mọi nơi làm phức tạp một chương trình khác đơn giản.

Có lớp học như vậy không? Ở đâu?

+7

Chỉ cần một vài nhận xét: Chuỗi .NET sử dụng UTF-16 trong nội bộ và bạn có thể tăng tốc độ so sánh rất nhiều bằng cách sử dụng [String.Compare] (http://msdn.microsoft.com/en-us/ thư viện/e6883c06.aspx) quá tải có một tham số [StringComparison] (http://msdn.microsoft.com/en-us/library/system.stringcomparison.aspx) và đặt nó thành Ordinal. – Dirk

+2

Tổng hợp thông thường sử dụng các giá trị số nguyên của mã hóa UTF-16 trực tiếp. Nó không tính đến văn hóa hiện tại hoặc liệu biểu tượng ký tự giống nhau có thể được mô tả bởi nhiều hơn một điểm mã unicode hay không. So sánh các giá trị này thường trả về true, nhưng sai khi sử dụng thứ tự. – Dirk

+0

Có, một số hàm chuỗi khác cũng nhận tham số StringComparison, bao gồm [String.IndexOf] (http://msdn.microsoft.com/en-us/library/system.string.indexof.aspx). – Dirk

Trả lời

6

Tôi nghĩ rằng tôi sẽ đăng kết quả nỗ lực của mình để triển khai hệ thống như được mô tả với sự hỗ trợ và khả năng tương thích nhiều nhất có thể. Nó có thể không hoàn hảo nhưng nó sẽ cung cấp cho bạn một cơ sở phong nha để cải thiện nếu cần thiết.

Chuỗi ASCIIChar và chuỗi ASCIIString chuyển hoàn toàn sang đối tác gốc của chúng để dễ sử dụng.

Đề xuất OP thay thế ToUpper/Lower etc đã được triển khai nhanh hơn nhiều so với danh sách tra cứu và tất cả các thao tác đều nhanh và thân thiện với bộ nhớ khi tôi có thể tạo chúng.

Rất tiếc, không thể đăng nguồn, quá dài. Xem các liên kết bên dưới.

  • ASCIIChar - Thay thế char, lưu trữ các giá trị trong một byte thay vì int và cung cấp phương pháp hỗ trợ và tương thích cho lớp chuỗi. Thực hiện ảo tất cả các phương thức và thuộc tính có sẵn cho char.

  • ASCIIChars - Cung cấp các thuộc tính tĩnh cho mỗi ký tự ASCII hợp lệ để dễ sử dụng.

  • ASCIIString - Thay thế chuỗi, lưu trữ các ký tự trong một mảng byte và thực hiện hầu như tất cả các phương thức và thuộc tính có sẵn cho chuỗi.

+0

Đơn giản chỉ cần tuyệt vời! Một lớp ASCIIString hoàn chỉnh với việc triển khai nhanh các phương thức giống hệt với API lớp String! Công việc tuyệt vời .... –

+0

Nhưng nó có thay đổi không? –

+1

@PeterLaCombJr. Có cả cấu trúc char và lớp chuỗi là không thay đổi (biến cục bộ duy nhất là chỉ đọc). – Ashigore

-2

Dotnet không có hỗ trợ chuỗi ASCII trực tiếp. Chuỗi là UTF16 vì Windows API hoạt động với ASCII (onr char - one byte) hoặc chỉ UTF16. Utf8 sẽ là giải pháp tốt nhất (java sử dụng nó), nhưng .NET không hỗ trợ nó vì Windows thì không.


Windows API có thể chuyển đổi giữa các bảng mã, nhưng cửa sổ api chỉ làm việc với 1 byte ký tự hoặc 2 ký tự byte, vì vậy nếu bạn sử dụng chuỗi UTF8 trong .NET bạn phải chuyển đổi chúng mỗi khi có tác động trong performace. Dotnet có thể sử dụng UTF8 và các encondings khác thông qua BinaryWriter/BinaryReader hoặc một StreamWriter/StreamReader đơn giản.

+1

Điều này không trả lời câu hỏi đã được hỏi. Nó phải là một bình luận. Bạn không có đủ đại diện để bình luận, nhưng điều đó thật khó khăn. Nhận được một số đại diện và sau đó bạn có thể bình luận. Và bạn có thể lấy đại diện bằng cách trả lời các câu hỏi với câu trả lời thực sự. –

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