2010-04-19 11 views
59

Durum-duyarlı modda HashSet<string>.Contains() yöntemi nasıl kullanılır?HashSet <string> .inserve modu durumunda .Contains() yöntemi nasıl kullanılır?

HashSet<string> hs = new HashSet<string>(StringComparer.OrdinalIgnoreCase); 

hs.Add("Hello"); 

Console.WriteLine(hs.Contains("HeLLo")); 
+4

Bir sidenode: zaman 'normal' 'HashSet ' (küçük harf duyarlı) oluşturulur, verimlidir bir 'contains' yöntemi oluşturmak imkansızdır. Bunun nedeni, elemanların karmalarının "HashSet" e eklendiklerinde oluşturulmalarıdır. Ve dahili olarak 'içerir' yöntemi, verimli olmaları için karmaları kontrol eder. Varolan bir karma formunu 'büyük/küçük harfe duyarlı' duruma 'büyük/küçük harfe duyarlı' olarak dönüştürmek mümkün değildir. – Julian

cevap

100

Özel bir karşılaştırıcısı ile HashSet oluşturabilirsiniz:

+13

+1 “InvariantCulture” yerine “Ordinal” kullandığınız için. .NET yönergeleri, çoğu durumda 'InvariantCulture' kullanılmamasını önermektedir (bkz. Http://msdn.microsoft.com/en-us/library/ms973919.aspx). – Steven

+1

CurrentCultureIgnoreCase genellikle daha iyi bir seçimdir. –

+3

@HansPassant neden? – guiomie

9

Doğru IEqualityComparer ile oluşturmanız gerekir kullanmak istiyorsun.

HashSet<String> hashSet = new HashSet<String>(StringComparer.InvariantCultureIgnoreCase); 

StringComparer nesne statik özellikleri gibi bazı sık kullanılan karşılaştırıcısı içerir.

5

Sen IEqualityComparer belirlemenizi sağlar constructor kullanmalıdır:

HashSet<string> hashset = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase); 
4

Diğer yanıtların gösterdiği gibi burada da gerekli değildir, ancak bir dizeyi kullanmadığınız diğer durumlarda, bir IEqualityComparer<T> uygulamayı seçebilir ve daha sonra bir .Contains aşırı yüklenmesini kullanabilirsiniz. İşte bir dizgeyi kullanan bir örnek (yine, diğer cevaplar, zaten ihtiyaçlarınızı karşılayan bir dizi karşılaştırıcı olduğunu göstermiştir). IEnumerable<T>'u çevreleyen birçok yöntem, bu tür karşılaştırıcıları kabul eden aşırı yüklere sahiptir, bu yüzden bunları nasıl uygulayacağınızı öğrenmek iyidir.

class CustomStringComparer : IEqualityComparer<string> 
{ 
    public bool Equals(string x, string y) 
    { 
     return x.Equals(y, StringComparison.InvariantCultureIgnoreCase); 
    } 

    public int GetHashCode(string obj) 
    { 
     return obj.GetHashCode(); 
    } 
} 

Ve sonra kullanmak o

bool contains = hash.Contains("foo", new CustomStringComparer()); 
İlgili konular