2009-03-10 28 views
131

Aşağıdakilerin büyük/küçük harfe duyarlı olduğunu biliyorum:C# durum duyarsız eşittir operatör var mı?

if (StringA == StringB) { 

İki dizeyi duyarsız bir şekilde karşılaştıracak bir operatör var mı?

+0

olası yinelenen: Aşağıdaki cevaba bakınız -

Ben karşılaştırma harf duyarlı veya boolean anlamsız durumda olup olmadığını belirtebilirsiniz basit dize uzatma yöntemi, kodlanmış ettik (http://stackoverflow.com/questions/501906/caselessly-comparing-strings-in-c-sharp) – nawfal

+0

Birisi bu soruya bir sözlük için bir sözlük duyarsız karşılaştırma ararken, bu soruya bir göz atın burada: [jenerik sözlük için Case duyarsız erişim] (http://stackoverflow.com/questions/13230414/case-insensitive-access-for-generic-dic tionary) – Robotnik

+0

Gerçekten güzel olurdu; büyük/küçük harf duyarsız bir versiyon olarak karşılık gelen '~ =' 'a paralel '==' tanımlamak. – eidylon

cevap

240

bu deneyin:

string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase); 
+0

Bağlantılı bir StackOverflow uzmanıyım - bir bağlantı ekleyerek ne demek istediğinizi açıklayabilir misiniz? MSDN dokümanlar için mi demek istiyorsun? –

+0

hızlı davranıyorsun .. lol Cevap yazıyordum bana ilk = D – Erick

+0

Bir MSDN linki ekleyebilirsin (ki genelde böyle yaparsın) ya da herhangi bir ilginç blog yazısı ya da cevabı genişletebilirsin. – Samuel

14
System.Collections.CaseInsensitiveComparer 

veya

System.StringComparer.OrdinalIgnoreCase 
+0

Bu, uygulamanın tamamını etkiler mi? – GateKiller

+0

Hayır, sadece onu kullandığınızda. – leppie

+2

Bu konuda daha fazla bilgiyi nereden bulabilirim? Bu, büyük/küçük harfe duyarlı olmayan bir eşleşme için kullanabileceğim anlamına mı geliyor? – GateKiller

3

Operatör? HAYIR, ama kültürünüzü değiştirebilirsiniz, böylece dize karşılaştırması büyük/küçük harfe duyarlı değildir.

Dizelerin eşitlik operatörü tarafından karşılaştırılma şeklini değiştireceğinden eminim.

+4

Bu biraz çirkin bir hack imho ... –

+0

Evet, tüm dize karşılaştırmalarının büyük/küçük harf duyarsız olmasını istemediğiniz sürece ne yapmak istediğinizi tam olarak söylemek istemiyorum. Ama bence eşit operatörün davranışını değiştirir. –

9
string.Equals(StringA, StringB, StringComparison.CurrentCultureIgnoreCase); 
0
if (StringA.ToUpperInvariant() == StringB.ToUpperInvariant()) { 

İnsanlar ToUpperInvariant() ToLowerInvariant daha() daha hızlıdır bildirmektedir.

+1

Mevcut veya istenen kültürün üst kılıf için özel kuralları varsa, değişmez bir fikir olabilir. – OregonGhost

+0

Ve semantikler de farklı. – leppie

+0

Bu, her dizenin yeni bir kopyasını oluşturur mu? Eğer öyleyse, kötü bir fikir. – cjk

3

Sen

if (stringA.equals(StringB, StringComparison.CurrentCultureIgnoreCase)) 
7

veya

if (StringA.Equals(StringB, StringComparison.CurrentCultureIgnoreCase)) { 

kullanabilirsiniz ancak Stringa boş olmadığından emin olmak gerekir. Yani muhtemelen daha iyi tu kullanım:

string.Equals(StringA , StringB, StringComparison.CurrentCultureIgnoreCase); 

John diye DÜZENLEME

önerdi: hata düzeltilmiş

0
string.Compare(string1, string2, true) 
+1

Bu, I18N sorunlarına sahip olabilir. –

16

herhangi bir türü için comparers dönmek StringComparer statik sınıfı özelliklerinin vardır harf duyarlılığı isteyebileceğiniz:

StringComparer Properties

Örneğin,

StringComparer.CurrentCultureIgnoreCase.Equals(string1, string2) 

veya

StringComparer.CurrentCultureIgnoreCase.Compare(string1, string2) 

Bir StringComparison argüman almak string.Equals veya string.Compare aşırı biraz daha temiz çağırabilir.

2

yüzden bu karşılaştırma yöntemlerinin sonunda yazmaya alışkınım:

, StringComparison. Yani bir uzantısı yaptı.

namespace System 
{ public static class StringExtension 
    { 
     public static bool Equals(this string thisString, string compareString, 
      StringComparison stringComparison) 
     { 
      return string.Equals(thisString, compareString, stringComparison); 
     } 
    } 
} 

Sadece öncesinde ext çağrılmasına thisString üzerinde boş olup olmadığını kontrol etmek gerekir unutmayın.

18

küçük harf görmezden 2 dizeleri karşılaştırmak için en iyi yolu ordinal vaka dize karşılaştırma görmezden belirterek String.Equals statik yöntemi kullanmaktır. Bu aynı zamanda en hızlı yoldur, dizeleri alt veya üst duruma dönüştürmekten ve ondan sonra karşılaştırmaktan çok daha hızlıdır.

Her iki yaklaşımın performansını test ettim ve sıralı göz ardı durumu karşılaştırması 9 kat daha hızlı! Aynı zamanda dizeleri alt veya büyük harflere çevirmekten daha güvenilirdir (Türkçe i problemine bakın). Eğer aşağıdaki kodu kullanabilirsiniz bir kültür özgü dize karşılaştırma yapmak istiyorsanız

String.Equals(string1, string2, StringComparison.OrdinalIgnoreCase); 

: Yani her zaman eşitlik için dizeleri karşılaştırmak için String.Equals yöntemi kullanmak

String.Equals(string1, string2, StringComparison.CurrentCultureIgnoreCase); 

Unutmayın ki ikinci örnek kullanımları Geçerli kültürün dizge karşılaştırma mantığı, bu, ilk örnekte "ordinal ignore case" karşılaştırmasından daha yavaş kılar; böylece herhangi bir kültüre özgü dize karşılaştırma mantığına ihtiyacınız yoksa ve maksimum performanstan sonraysanız, " ordinal davayı görmezden gelme. Daha fazla bilgi için, read the full story on my blog.

+0

ToLower' veya ToLowerInvariant' öğesini önerme: yalnızca bir karşılaştırma yapmak için bellek oluştururlar ve yeni karakter kümeleri unicode'a eklendikçe başarısız olabilirler. 'ToUpper', Türk 'i' ve diğerlerinin yanı sıra başarısız oluyor; ToLower'ın benzer nedenlerle gelecekte başarısız olmayacağının bir nedeni yok. – antiduh

+0

@antiduh, yorumunuz için teşekkür ederiz. Çoğumuz bu potansiyel sorunların farkındayız, İnternet üzerinden birçok öğretici örnek olarak Türk 'i' yi veriyor. Gönderiimde gördüğünüz gibi, 'ToLower' veya' ToLowerInvariant' yöntemlerini kullanmanızı önermiyorum, 'String.Equals' yönteminin ne kadar verimli olduğunu göstermek istedim. –

+3

"Çoğumuz bu potansiyel sorunların farkındayız, internet üzerinden birçok öğretici Türk 'i' 'i bir örnek olarak veriyor - yeterli insan yok ve hala cevabınızdaki ikinci cümle olarak bahsediyorsunuz. Dahası, * cevabınız * asla kullanmamak için yeterli gerekçe içermez - sadece performanstan bahsedersiniz; Performans her zaman en öncelikli değildir. Sonuç olarak, şu anda yardım merkezi yönergelerini ihlal ediyorsunuz. Dış sitelere linkler iyi, ancak içeriği yeterince özetlemediniz (türkçe 'i' problemi). SO senin reklam platformun değil. – antiduh

İlgili konular