Як я можу зробити Array.Contains нечутливий до регістру на рядковому масиві?


172

Я використовую Array.Containsметод на рядковому масиві. Як я можу зробити цей нечутливий до випадку?

Відповіді:


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

Або залежно від конкретної обставини, ви можете віддати перевагу:

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

4
За msdn.microsoft.com/en-us/library/dd465121.aspx , "інваріантна культура має дуже мало властивостей, що робить її корисною для порівняння". Майже у всіх випадках, коли ви не бажаєте порівняти конкретні культури ( CurrentCulture), вам слід скористатися, Ordinalа не використовувати InvariantCulture.
— бдукс

2
@bdukes Це занадто сильне твердження. Є вагомі причини використання InvariantCulture. Використання будь-якого з трьох вищезазначених варіантів залежить від обставини. Я не заперечую проти вашого переупорядкування, але я видаляю коментар "напевно, не". У відповіді вже зрозуміло, що вам слід вибрати той, який працює для вас у ситуації, що склалася.
— Мехрдад Афшарі

1
Знадобилося мені хвилину, щоб зрозуміти, що Contains - це метод розширення в System.Linq.
— Крейг Селест

LINQ, щоб знову врятувати день.
— Брайантей

@MehrdadAfshari У цьому випадку попередній коментар цілком справедливий. "Містить" потрібно лише перевірити рівність, що є більш ефективним при Ординальному порівнянні. Інші порівняння, відомі «Культурі», стосуються впорядкування символів, і тому мають значення лише для сортування.
— користувач1751825

9

Деякі важливі зауваження з моєї сторони, або, принаймні, розміщення розповсюдженої інформації в одному місці, що стосується наконечника вище за допомогою StringComparer, як у:

if (array.Contains("str", StringComparer.OrdinalIgnoreCase))
{}
  1. array.Contains() є методом розширення LINQ і тому працює стандартно лише з .NET 3.5 або новішою версією, потребуючи:
    using System;
    using System.Linq;

  2. Але: у .NET 2.0 простий Contains()метод (без врахування нечутливості випадків) принаймні можливий, як цей, із закликом:

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

    Оскільки метод Contains () є частиною інтерфейсу IList, він працює не тільки з масивами, але і зі списками тощо.


1

Вкажіть спеціальний IEqualityComparer, який враховує нечутливість до випадку.

Додатково перевірте це . Тож (теоретично) все, що вам потрібно буде зробити, це:

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

18
Тому що до 5 хвилин тому я не знав, що існує StringComparer. :)
— Кон

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

4
Але хіба це не зробить дорогий дзвінок ToLower () на кожен елемент у списку? String.Equals з перевантаженням StringComppare краще підійде в цьому прикладі.
— Майк Коул
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.