2013-03-11 1 views
7

私はリストに単語のリストを持っています。 .Contains()を使用すると、単語がリストに含まれているかどうかを判断できます。指定した単語がリストにある場合、その単語の大文字と小文字を区別するスペルをリストから取得するにはどうすればよいですか?たとえば、.Contains()は単語が "リン酸ナトリウム"であるが、 "リン酸ナトリウム"が含まれている場合はtrueです。大文字と小文字を区別しない検索(「リン酸ナトリウム」)を実行するには、どのようにして大文字と小文字を区別する一致(「リン酸ナトリウム」)をリストから戻しますか?List <string>で大文字と小文字を区別しない一致を取得するにはどうすればよいですか?

私は、キーが大文字で値が適切な場合、またはその逆の場合は、辞書を避けることをお勧めします。

+0

サイドノート:あなたのタイトルには「大文字と小文字が区別されます」と書かれていますが、反対の相手を探しているようです。また、大文字と小文字を区別しないキーマッチで辞書を使用しない*特別な理由はありますか? –

+0

@AlexeiLevenkovまあ、辞書を使うと、より適切な(この文脈では)検索方法を使うのではなく、プログラムのメモリフットプリントが3倍になります。 – Servy

+0

@Servy、argee、ただしリストを使った線形検索は役に立ちません - 順序付けられていないリストが条件であるかどうかという質問から私には完全にはっきりしません。 –

答えて

15

あなたのような何かをしたい:

string match = list.FirstOrDefault(element => element.Equals(target, 
            StringComparison.CurrentCultureIgnoreCase)); 

一致が見つからないことができる場合、これはnull参考にmatchを残します。 任意の上一連の文字列)

なお -

using System.Linq;ディレクティブでファイルの先頭にあなたがList<T>.Findを使用することができ、それが動作するようFirstOrDefaultを使用すると、コードはより一般的になり)。私はリストにnull要素がないと仮定しています。それを処理したい場合は、string.Equals(element, target, StringComparison.CurrentCultureIgnoreCase)の代わりに静的メソッド呼び出しを使用します。

また、文化に敏感な比較をしたいと思っています。他のオプションについては、StringComparisonを参照してください。

+0

奇妙なことに、なぜ 'StringComparison.OrdinalIgnoreCase'? –

+0

+1これは質問に対する絶対的な正解ですが、順不同リストによる線形検索は、100s項目の最も速い操作リストではないので、このようにすれば簡単に問題になるかもしれません。 –

+1

@AlexeiLevenkov何百もの問題は全くありません。あなたは本当に大きな問題になるには何十万もの人が必要になります。 – Servy

0

大文字と小文字を区別しない比較を使用すると、Dictionaryを考慮する必要があります。あなたが単語の順序を気にしない限り、リストよりもルックアップのほうがはるかに良いパフォーマンスを与えるでしょうDictionary

Dictionary<string, string> openWith = 
     new Dictionary<string, string>( 
     StringComparer.CurrentCultureIgnoreCase); 
関連する問題