2009-10-07 40 views
18

Tôi cần danh sách phân biệt chữ hoa chữ thường hoặc loại bộ sưu tập (của chuỗi). Cách dễ nhất để tạo một cái là gì? Bạn có thể chỉ định loại so sánh bạn muốn nhận trên các khóa của một Từ điển, nhưng tôi không thể tìm thấy bất kỳ thứ gì tương tự cho một Danh sách.Danh sách phân biệt chữ hoa chữ thường

Trả lời

3

Hình như có thể của nó để tận dụng lớp KeyedCollection:

public class Set<T> : KeyedCollection<T,T> 
{ 
    public Set() 
    {} 

    public Set(IEqualityComparer<T> comparer) : base(comparer) 
    {} 

    public Set(IEnumerable<T> collection) 
    { 
     foreach (T elem in collection) 
     { 
      Add(elem); 
     } 
    } 

    protected override T GetKeyForItem(T item) 
    { 
     return item; 
    } 
} 
31

Giả sử bạn đang sử dụng .NET 3.5, bạn chỉ có thể sử dụng:

var strings = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase); 

... hoặc một cái gì đó tương tự, nơi bạn muốn chọn nền văn hóa thích hợp thiết lập là tốt.

Danh sách không thực sự có ý tưởng so sánh nhiều nhất - chỉ khi bạn gọi IndexOf và các phương pháp liên quan. Tôi không tin rằng có bất kỳ cách nào để chỉ định so sánh để sử dụng cho điều đó. Tuy nhiên, bạn có thể sử dụng List<T>.Find với biến vị ngữ.

+1

Tôi bị kẹt với .Net 2 thật đáng buồn: ( – Grzenio

2

Câu chuyện tương tự tại đây, nơi tìm cách kiểm tra contains

ví dụ:

public static bool Contains(this string source, string toCheck, StringComparison comp) 
     { 
      return source.IndexOf(toCheck, comp) >= 0; 
     } 
20

Sử dụng LINQ, điều này cho biết thêm một phương pháp mới để .Compare

using System.Linq; 
using System.Collections.Generic; 

List<string> MyList = new List<string>(); 

MyList.Add(...) 

if (MyList.Contains(TestString, StringComparer.CurrentCultureIgnoreCase)) { 
    //found 
} 
+0

Bạn không cần 'LINQ' để sử dụng phương thức Chứa –

+0

@ geo1701: nhưng bạn ** cần ** 'bằng cách sử dụng System.Linq' để tải quá tải mới bằng' StringComparer'! –

+0

Cảm ơn, câu trả lời hay, tôi đã hy vọng có một phần mở rộng, thay vì phải tự viết. Nếu không tôi sẽ không biết nơi để tìm! – Abacus

0
var Addresses = Pr.Where(a = >a.Key.ToUpper() == "KEY VALUE").ToList(); 

Chỉ cần chắc phím của bạn chữ hoa và tìm kiếm UPPERCASE VALUE

+0

Đây chính là bản hack tôi muốn tránh. – Grzenio

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