Làm cách nào tôi có thể tạo Array.Contains không phân biệt chữ hoa chữ thường trên một mảng chuỗi?


172

Tôi đang sử dụng Array.Containsphương thức trên một chuỗi chuỗi. Làm thế nào tôi có thể làm cho trường hợp đó không nhạy cảm?

Câu trả lời:


307
array.Contains("str", StringComparer.OrdinalIgnoreCase);

Hoặc tùy thuộc vào hoàn cảnh cụ thể, bạn có thể thích:

array.Contains("str", StringComparer.CurrentCultureIgnoreCase);
array.Contains("str", StringComparer.InvariantCultureIgnoreCase);

4
Per msdn.microsoft.com/en-us/l Library / dd465121.aspx , "văn hóa bất biến có rất ít thuộc tính làm cho nó hữu ích để so sánh." Trong hầu hết các trường hợp bạn không muốn so sánh cụ thể về văn hóa ( CurrentCulture), bạn nên sử dụng Ordinalchứ không phải InvariantCulture.
bdukes

2
@bdukes Đó là một tuyên bố quá mạnh mẽ. Có những lý do hợp lệ để sử dụng InvariantCulture. Sử dụng bất kỳ một trong ba lựa chọn ở trên tùy thuộc vào hoàn cảnh. Tôi không phản đối việc sắp xếp lại của bạn, nhưng tôi đang xóa nhận xét "có thể không". Điều đó đã được làm rõ trong câu trả lời rằng bạn nên chọn câu trả lời phù hợp với bạn trong tình huống hiện tại.
Mehrdad Afshari

1
Phải mất một lúc tôi mới nhận ra rằng Chứa là một phương thức mở rộng trong System.Linq.
Craig Celeste

LINQ để tiết kiệm trong ngày một lần nữa.
Bryantee

@MehrdadAfshari Trong trường hợp này, nhận xét trước đó là hoàn toàn hợp lệ. "Chứa" chỉ cần kiểm tra sự bình đẳng, hiệu quả hơn với so sánh thông thường. Các so sánh nhận thức "Văn hóa" khác liên quan đến việc sắp xếp các ký tự, và do đó chỉ liên quan đến việc sắp xếp.
dùng1751825

9

Một số lưu ý quan trọng từ phía tôi, hoặc ít nhất là đặt một số thông tin phân tán ở một nơi - liên quan đến mẹo ở trên với StringComparer như trong:

if (array.Contains("str", StringComparer.OrdinalIgnoreCase))
{}
  1. array.Contains() là một phương thức mở rộng LINQ và do đó chỉ hoạt động theo tiêu chuẩn với .NET 3.5 trở lên, cần:
    using System;
    using System.Linq;

  2. Nhưng: trong .NET 2.0, Contains()phương thức đơn giản (không tính đến trường hợp không nhạy cảm với tài khoản) ít nhất có thể như thế này, với một diễn viên:

    if ( ((IList<string>)mydotNet2Array).Contains(“str”) ) {}

    Vì phương thức Contains () là một phần của giao diện IList, nên phương thức này hoạt động không chỉ với các mảng, mà còn với các danh sách, v.v.


1

Triển khai một IEqualityComparer tùy chỉnh có tính đến trường hợp không nhạy cảm.

Ngoài ra, kiểm tra này . Vì vậy, về lý thuyết, tất cả những gì bạn phải làm là:

myArray.Contains("abc", ProjectionEqualityComparer<string>.Create(a => a.ToLower()))

18
Bởi vì cho đến 5 phút trước tôi không biết StringComparer tồn tại. :)
Kon

0
new[] { "ABC" }.Select(e => e.ToLower()).Contains("abc") // returns true

4
Nhưng điều này có thực hiện cuộc gọi ToLower () tốn kém cho từng mục trong danh sách không? String.Equals với quá tải StringComparison sẽ phù hợp hơn trong ví dụ này.
Mike Cole
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.