Comment puis-je rendre Array.Contains insensible à la casse sur un tableau de chaînes?

172

J'utilise la Array.Containsméthode sur un tableau de chaînes. Comment puis-je rendre cela insensible à la casse?

Mike Cole
la source

Réponses:

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

Ou selon les circonstances spécifiques, vous pourriez préférer:

array.Contains("str", StringComparer.CurrentCultureIgnoreCase);
array.Contains("str", StringComparer.InvariantCultureIgnoreCase);
Mehrdad Afshari
la source
4
Selon msdn.microsoft.com/en-us/library/dd465121.aspx , «la culture invariante a très peu de propriétés qui la rendent utile pour la comparaison». Dans presque tous les cas où vous ne voulez pas de comparaison spécifique à la culture ( CurrentCulture), vous devriez utiliser Ordinalplutôt que InvariantCulture.
bdukes
2
@bdukes C'est une affirmation trop forte. Il y a des raisons valables d'utiliser InvariantCulture. L'utilisation de l'un des trois choix ci-dessus dépend des circonstances. Je ne m'oppose pas à votre réorganisation, mais je supprime le commentaire «probablement pas». Il est déjà clairement indiqué dans la réponse que vous devez choisir celui qui vous convient dans la situation actuelle.
Mehrdad Afshari
1
Il m'a fallu un moment pour réaliser que Contains est une méthode d'extension dans System.Linq.
Craig Celeste
LINQ pour sauver à nouveau la situation.
Bryantee
@MehrdadAfshari Dans ce cas, le commentaire précédent est parfaitement valable. "Contient" n'a besoin que de vérifier l'égalité, ce qui est plus efficace avec la comparaison ordinale. Les autres comparaisons sensibles à la "Culture" concernent l'ordre des caractères et ne sont donc pertinentes que pour le tri.
user1751825
9

Quelques notes importantes de mon côté, ou du moins mettre des informations distribuées à un endroit - concernant le conseil ci-dessus avec un StringComparer comme dans:

if (array.Contains("str", StringComparer.OrdinalIgnoreCase))
{}
  1. array.Contains() est une méthode d'extension LINQ et fonctionne donc en standard uniquement avec .NET 3.5 ou supérieur, nécessitant:
    using System;
    using System.Linq;

  2. Mais: dans .NET 2.0, la Contains()méthode simple (sans prendre en compte l'insensibilité à la casse) est au moins possible comme ceci, avec un cast:

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

    Comme la méthode Contains () fait partie de l'interface IList, cela fonctionne non seulement avec les tableaux, mais aussi avec les listes, etc.

Philm
la source
1

Implémentez un IEqualityComparer personnalisé qui prend en compte l'insensibilité à la casse.

De plus, vérifiez ceci . Alors (en théorie) tout ce que vous auriez à faire est:

myArray.Contains("abc", ProjectionEqualityComparer<string>.Create(a => a.ToLower()))
Kon
la source
18
Parce que jusqu'à il y a 5 minutes, je ne savais pas qu'un StringComparer existait. :)
Kon
0
new[] { "ABC" }.Select(e => e.ToLower()).Contains("abc") // returns true
Darin Dimitrov
la source
4
Mais cela n'effectuerait-il pas un appel ToLower () coûteux sur chaque élément de la liste? String.Equals avec la surcharge StringComparison serait mieux adapté dans cet exemple.
Mike Cole