Array.Contains dize dizisinde büyük / küçük harf duyarsız nasıl yapabilirim?


172

Array.ContainsBir dize dizisi yöntemini kullanıyorum . Bu büyük / küçük harfe duyarsız hale nasıl getirebilirim?

Yanıtlar:


307
array.Contains("str", StringComparer.OrdinalIgnoreCase);

Veya belirli koşullara bağlı olarak aşağıdakileri tercih edebilirsiniz:

array.Contains("str", StringComparer.CurrentCultureIgnoreCase);
array.Contains("str", StringComparer.InvariantCultureIgnoreCase);

4
Msdn.microsoft.com/en-us/library/dd465121.aspx uyarınca , "değişmez kültür karşılaştırma için yararlı kılan çok az özelliğe sahiptir." Kültüre özgü bir karşılaştırma ( CurrentCulture) istemediğiniz neredeyse tüm durumlarda , Ordinalyerine kullanmak zorundasınız InvariantCulture.
bdukes

2
@bdukes Bu çok güçlü bir ifade. Geçerli kullanım nedenleri vardır InvariantCulture. Yukarıdaki üç seçenekten herhangi birinin kullanılması duruma bağlıdır. Yeniden düzenlemenize itiraz etmiyorum, ancak "büyük olasılıkla" yorumunu kaldırıyorum. Cevapta şimdiki durumda sizin için uygun olanı seçmeniz gerektiği açıkça belirtildi.
Mehrdad Afshari

1
Contains'ın System.Linq'te bir genişletme yöntemi olduğunu fark etmem biraz zaman aldı.
Craig Celeste

LINQ günü tekrar kurtarmak için.
Bryantee

@MehrdadAfshari Bu durumda önceki yorum mükemmel şekilde geçerlidir. "İçerir" sadece Eşitliği kontrol etmelidir, bu da Ordinal karşılaştırmayla daha verimlidir. Diğer "Kültür" farkında karşılaştırmaları karakterlerin sıralaması ile ilgilidir ve bu nedenle sadece sıralama için önemlidir.
user1751825

9

Benim tarafımdan bazı önemli notlar, ya da en azından bir yere dağıtılmış bazı bilgiler koymak - yukarıdaki gibi bir StringComparer ile ipucu:

if (array.Contains("str", StringComparer.OrdinalIgnoreCase))
{}
  1. array.Contains() bir LINQ genişletme yöntemidir ve bu nedenle standart olarak yalnızca .NET 3.5 veya üstü ile çalışır ve aşağıdakileri gerektirir:
    using System;
    using System.Linq;

  2. Ancak: .NET 2.0'da basit Contains()yöntem (büyük / küçük harf duyarsızlığı hesaba katılmadan) en azından şu şekilde mümkündür:

    if ( ((IList<string>)mydotNet2Array).Contains(“str”) ) {}

    Contains () yöntemi IList arabiriminin bir parçası olduğundan, bu yalnızca dizilerle değil listelerle de çalışır.


1

Büyük / küçük harf duyarsızlığını dikkate alan özel bir IEqualityComparer uygulayın .

Ayrıca, kontrol bu dışarı. Öyleyse (teoride) tek yapmanız gereken:

myArray.Contains("abc", ProjectionEqualityComparer<string>.Create(a => a.ToLower()))

18
Çünkü 5 dakika öncesine kadar bir StringComparer'ın var olduğunu bilmiyordum. :)
Kon

0
new[] { "ABC" }.Select(e => e.ToLower()).Contains("abc") // returns true

4
Ancak bu, listedeki her öğeye pahalı bir ToLower () çağrısı yapmaz mı? StringComparison aşırı yüklemesi olan eşitlikler bu örnekte daha uygundur.
Mike Cole
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.