2012-01-18 33 views
21

Sự khác biệt giữa hai lớp học này là gì?Sự khác biệt giữa các lớp System.StringComparer và System.StringComparison?

Tôi đã sử dụng System.StringComparer.OrdinalIgnoreCase()System.StringComparison.OrdinalIgnoreCase() và cả hai đều mang lại kết quả tương tự. Họ có bất kỳ sự khác biệt hoặc cả hai đều giống nhau?

+1

bạn có thể đăng trường hợp của mình và kết quả mong đợi cho từng trường hợp hay không. Tôi tự hỏi nếu bạn đang so sánh == vs Equals về tham chiếu vs giá trị – MethodMan

+0

'System.StringComparison.OrdinalIgnoreCase' là một giá trị enum, không phải là một phương pháp. Vì vậy, 'System.StringComparison.OrdinalIgnoreCase()' sẽ không biên dịch. Không chắc chắn những gì bạn thực sự có ý nghĩa. – AakashM

Trả lời

14

StringComparer là một Class mà thực hiện giao diện so sánh như IComparer, IEqualityComparer, IComparer<String>, vì vậy nó có thể được sử dụng để so sánh hai chuỗi.

StringComparison chỉ đơn giản là một Enum mà bạn có thể chuyển sang một số phương pháp nhất định để chỉ ra loại so sánh nào bạn muốn. Trong trường hợp đó tôi nghi ngờ phương pháp cơ bản sẽ sử dụng StringComparer để so sánh thực tế.

Khi sử dụng mỗi

Chuỗi phương pháp cụ thể như String.Equals chỉ chấp nhận một giá trị StringComparison, vì vậy đó là những gì bạn sẽ sử dụng trong trường hợp này.

Bạn sẽ sử dụng một số StringComparer cho các phương thức so sánh làm tham số và được gọi trong ngữ cảnh trong đó chuỗi sẽ được so sánh. Ví dụ, nếu bạn đã có một List<String>, và muốn Sort liệt kê một cách case-insensitive, bạn có thể làm:

myList.Sort(StringComparer.OrdinalIgnoreCase); 
3

Câu hỏi đặt ra là: tại sao có trong một khuôn khổ cả trong số họ?

Lời giải thích là một trong những điều này:

  • StringComparison là:

Xác định văn hóa, trường hợp và sắp xếp các nguyên tắc được sử dụng bởi một số quá tải của String.Compare và Phương thức String.Equals

  • StringComparer là:

Đại diện cho một chuỗi hoạt động so sánh có sử dụng trường hợp cụ thể và quy tắc văn hóa dựa trên hoặc so sánh thứ tự

Nhận thấy một sự khác biệt?

Trong trường hợp thứ hai, vì vậy trong trường hợp StringComparer có khái niệm là string comparison operation, nhưng không phải là string loại.

Trong thực tế, nếu bạn nhìn vào this bạn sẽ đọc đơn giản:

Một số phương pháp không theo chuỗi có chuỗi so sánh như một hoạt động trung tâm sử dụng các loại StringComparer.

Một ví dụ, so với cùng liên kết:

Array.BinarySearch(this.storedNames, name, StringComparer.Ordinal) 

tôi sử dụng StringComparer như một so sánh "cơ sở" trong nội dung của các loại array tham khảo.

+0

Liên kết của bạn không phải là tiếng Anh – Mubarek

+0

Liên kết đã được cập nhật – StingyJack

+1

Câu trả lời hay. Để làm cho nó rõ ràng hơn: Bạn có thể không bao giờ thiết kế một phương thức hoặc lớp nơi bạn lấy StringComparison làm đầu vào - bạn nên sử dụng StringComparer để thay thế, vì điều này sẽ cho phép các máy khách mã của bạn vượt qua trong trình so sánh tùy chỉnh của riêng chúng nếu cần. So sánh có thể mở rộng, trong khi so sánh thì không. –

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