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ます。
— bdukes '25

2
@bdukesそれは強すぎる声明です。使用する正当な理由がありますInvariantCulture。上記の3つの選択肢のいずれを使用するかは、状況によって異なります。私はあなたの並べ替えに反対しませんが、「おそらくない」コメントを削除します。回答では、現在の状況で有効なものを選択する必要があることはすでに明確になっています。
— Mehrdad Afshari、2011

1
ContainsがSystem.Linqの拡張メソッドであることを理解するのに少し時間がかかりました。
— Craig Celeste 2014年

LINQはその日を再び救います。
— ブライアンティー

@MehrdadAfshariこの場合、前のコメントは完全に有効です。「含む」は、等しいかどうかをチェックするだけでよく、序数比較でより効率的です。他の「Culture」対応の比較は文字の順序に関係しているため、ソートにのみ関連しています。
— user1751825

9

私の側からのいくつかの重要なメモ、または少なくともいくつかの配布された情報を1つの場所に配置する-次のような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が存在することを知りませんでした。:)
— Kon

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

4
しかし、これはリスト内の各項目に対してコストのかかるToLower()呼び出しを実行しませんか?この例では、StringComparisonオーバーロードを含むString.Equalsの方が適しています。
— Mike Cole
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.