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?

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);

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.


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()))

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.