Jak sprawić, aby Array.Contains nie rozróżniała wielkości liter w tablicy ciągów?


172

Używam Array.Containsmetody na tablicy ciągów. Jak sprawić, by wielkość liter nie była rozróżniana?

Odpowiedzi:


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

Lub, w zależności od konkretnych okoliczności, możesz preferować:

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

4
Według msdn.microsoft.com/en-us/library/dd465121.aspx „niezmienna kultura ma bardzo niewiele właściwości, które czynią ją przydatną do porównań”. W prawie wszystkich przypadkach, w których nie potrzebujesz porównania specyficznego dla kultury ( CurrentCulture), powinieneś użyć Ordinalzamiast InvariantCulture.
bdukes

2
@bdukes To zbyt mocne stwierdzenie. Istnieją ważne powody do korzystania InvariantCulture. Użycie którejkolwiek z trzech powyższych opcji zależy od okoliczności. Nie sprzeciwiam się zmianie kolejności, ale usuwam komentarz „prawdopodobnie nie”. W odpowiedzi jest już jasne, że powinieneś wybrać ten, który działa dla Ciebie w obecnej sytuacji.
Mehrdad Afshari

1
Chwilę zajęło mi uświadomienie sobie, że Contains jest metodą rozszerzającą w System.Linq.
Craig Celeste

LINQ, aby ponownie zapisać dzień.
Bryantee

@MehrdadAfshari W tym przypadku poprzedni komentarz jest całkowicie poprawny. „Zawiera” wystarczy sprawdzić równość, co jest bardziej wydajne w porównaniu z porządkiem. Inne porównania uwzględniające „kulturę” dotyczą porządkowania znaków i dlatego mają znaczenie tylko przy sortowaniu.
user1751825

9

Kilka ważnych uwag z mojej strony lub przynajmniej umieszczenie w jednym miejscu niektórych informacji dystrybuowanych - dotyczących powyższej wskazówki z StringComparer, jak w:

if (array.Contains("str", StringComparer.OrdinalIgnoreCase))
{}
  1. array.Contains() jest metodą rozszerzenia LINQ i dlatego działa standardowo tylko z .NET 3.5 lub nowszym, wymagając:
    using System;
    using System.Linq;

  2. Ale: w .NET 2.0 prosta Contains()metoda (bez uwzględniania wielkości liter) jest przynajmniej możliwa w następujący sposób, z rzutowaniem:

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

    Ponieważ metoda Contains () jest częścią interfejsu IList, działa to nie tylko z tablicami, ale także z listami itp.


1

Zaimplementuj niestandardowy IEqualityComparer, który bierze pod uwagę niewrażliwość na wielkość liter.

Dodatkowo sprawdź to . Zatem (w teorii) wszystko, co musisz zrobić, to:

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

18
Ponieważ do 5 minut temu nie wiedziałem, że istnieje StringComparer. :)
Kon

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

4
Ale czy nie spowodowałoby to kosztownego wywołania ToLower () dla każdego elementu na liście? String.Equals z przeciążeniem StringComparison byłby lepiej dopasowany w tym przykładzie.
Mike Cole
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.