Nếu tôi có một Dictionary<String,...>
phương pháp như ContainsKey
không phân biệt chữ hoa chữ thường?
Điều này có vẻ liên quan, nhưng tôi đã không hiểu đúng: c # Dictionary: làm cho Key không phân biệt chữ hoa chữ thường thông qua khai báo
Nếu tôi có một Dictionary<String,...>
phương pháp như ContainsKey
không phân biệt chữ hoa chữ thường?
Điều này có vẻ liên quan, nhưng tôi đã không hiểu đúng: c # Dictionary: làm cho Key không phân biệt chữ hoa chữ thường thông qua khai báo
Câu trả lời:
Điều này có vẻ liên quan, nhưng tôi đã không hiểu đúng: c # Dictionary: làm cho Key không phân biệt chữ hoa chữ thường thông qua khai báo
Nó thực sự có liên quan. Giải pháp là yêu cầu cá thể từ điển không sử dụng phương thức so sánh chuỗi tiêu chuẩn (phân biệt chữ hoa chữ thường) mà là sử dụng một trường hợp không phân biệt chữ hoa chữ thường. Điều này được thực hiện bằng cách sử dụng hàm tạo thích hợp :
var dict = new Dictionary<string, YourClass>(
StringComparer.InvariantCultureIgnoreCase);
Hàm tạo dự kiến sẽ IEqualityComparer
cho từ điển biết cách so sánh các khóa.
StringComparer.InvariantCultureIgnoreCase
cung cấp cho bạn một IEqualityComparer
ví dụ so sánh các chuỗi theo cách không phân biệt chữ hoa chữ thường.
var myDic = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
myDic.Add("HeLlo", "hi");
if (myDic.ContainsKey("hello"))
Console.WriteLine(myDic["hello"]);
Có rất ít khả năng thỏa thuận của bạn với từ điển được lấy từ bên thứ 3 hoặc dll bên ngoài. Sử dụng linq
YourDictionary.Any(i => i.KeyName.ToLower().Contains("yourstring")))
Any
thành SingleOrDefault
bạn sẽ không null
quay lại nếu nó không tồn tại, thay vào đó bạn sẽ nhận được một keyvaluepair với cả khóa và giá trị được đặt thành null
!
Contains
Có vẻ như một trường hợp sử dụng rất cụ thể cho một cái gì đó bạn đang làm việc tại thời điểm đó. Là một câu trả lời hữu ích chung chung hơn, tôi nghĩ Equals
là tốt hơn. Và trên cùng một lưu ý, thay vì sao chép một chuỗi với ToLower()
, nó sẽ còn tốt hơn để sử dụng StringComparison.xxxCase
.
dict.Keys.Contains("bla", appropriate comparer)
quá tải LINQ để dễ sử dụng.
Tôi vừa gặp phải rắc rối tương tự khi tôi cần một từ điển nhạy cảm caseIN trong bộ điều khiển ASP.NET Core.
Tôi đã viết một phương pháp mở rộng mà thực hiện các mẹo. Có lẽ điều này cũng có thể hữu ích cho những người khác ...
public static IDictionary<string, TValue> ConvertToCaseInSensitive<TValue>(this IDictionary<string, TValue> dictionary)
{
var resultDictionary = new Dictionary<string, TValue>(StringComparer.InvariantCultureIgnoreCase);
foreach (var (key, value) in dictionary)
{
resultDictionary.Add(key, value);
}
dictionary = resultDictionary;
return dictionary;
}
Để sử dụng phương thức mở rộng:
myDictionary.ConvertToCaseInSensitive();
Sau đó nhận được một giá trị từ từ điển với:
myDictionary.ContainsKey("TheKeyWhichIsNotCaseSensitiveAnymore!");
Nếu bạn không có quyền kiểm soát trong việc tạo cá thể, giả sử đối tượng của bạn bị khử từ json, v.v., bạn có thể tạo một lớp bao bọc kế thừa từ lớp từ điển.
public class CaseInSensitiveDictionary<TValue> : Dictionary<string, TValue>
{
public CaseInSensitiveDictionary() : base(StringComparer.OrdinalIgnoreCase){}
}
StringComparer.InvariantCultureIgnoreCase
? Nó thực hiện những gì nó nói ...