Eğer bir yöntemim varsa Dictionary<String,...>
,ContainsKey
küçük harfe duyarlı olmayan mü?
Bu ilgili görünüyordu, ama düzgün anlamadım: c # Sözlük: beyanları ile Key case-insensitive yapma
Eğer bir yöntemim varsa Dictionary<String,...>
,ContainsKey
küçük harfe duyarlı olmayan mü?
Bu ilgili görünüyordu, ama düzgün anlamadım: c # Sözlük: beyanları ile Key case-insensitive yapma
Yanıtlar:
Bu ilgili görünüyordu, ama düzgün anlamadım: c # Sözlük: beyanları ile Key case-insensitive yapma
Gerçekten ilişkilidir. Çözüm, sözlük örneğine standart dize karşılaştırma yöntemini (büyük / küçük harfe duyarlı) değil, büyük / küçük harfe duyarlı olmayan bir yöntem kullanmasını söylemektir. Bu, uygun kurucu kullanılarak yapılır :
var dict = new Dictionary<string, YourClass>(
StringComparer.InvariantCultureIgnoreCase);
Yapıcı IEqualityComparer
sözlüğe anahtarların nasıl karşılaştırılacağını söyler.
StringComparer.InvariantCultureIgnoreCase
IEqualityComparer
dizeleri büyük / küçük harfe duyarlı olmayan bir şekilde karşılaştıran bir örnek verir .
var myDic = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
myDic.Add("HeLlo", "hi");
if (myDic.ContainsKey("hello"))
Console.WriteLine(myDic["hello"]);
3. parti veya harici dll çekti sözlük ile anlaşma az şansı vardır. Linq kullanma
YourDictionary.Any(i => i.KeyName.ToLower().Contains("yourstring")))
Any
hiç SingleOrDefault
almazsınız size null
o yoksa geriye, yerine anahtarı ve değer kümesi hem bir KeyValuePair alacak null
!
Contains
O zaman üzerinde çalıştığınız bir şeyin çok özel bir kullanım durumu gibi görünüyor. Daha genel bir yardımcı cevap Equals
olarak daha iyi olduğunu düşünüyorum . Ve aynı notta, bir dizeyi çoğaltmak yerine, ToLower()
kullanmak daha da iyi olurdu StringComparison.xxxCase
.
dict.Keys.Contains("bla", appropriate comparer)
kolaylığı için LINQ aşırı yükünü kullanın.
Ben sadece bir ASP.NET Core denetleyicisinde bir caseINsensitive sözlük gerektiğinde aynı tür bir sorunla karşılaştı.
Hile yapan bir uzatma yöntemi yazdım. Belki bu başkaları için de yararlı olabilir ...
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;
}
Uzantı yöntemini kullanmak için:
myDictionary.ConvertToCaseInSensitive();
Ardından sözlükten bir değer alın:
myDictionary.ContainsKey("TheKeyWhichIsNotCaseSensitiveAnymore!");
Örnek oluşturmada herhangi bir denetiminiz yoksa, nesnenizin json vb. Tarafından yok edildiğini varsayalım, sözlük sınıfından miras alan bir sarmalayıcı sınıfı oluşturabilirsiniz.
public class CaseInSensitiveDictionary<TValue> : Dictionary<string, TValue>
{
public CaseInSensitiveDictionary() : base(StringComparer.OrdinalIgnoreCase){}
}
StringComparer.InvariantCultureIgnoreCase
? Ne diyor ...