2011-01-14 4 views
6

の方法では、文字列の束をに格納する単純なコレクションを探しています。特定の文字列が存在するかどうかを確認し、その文字列を削除するには、少なくともContains()Remove()メソッドが必要です。募集:大量の大文字と小文字を区別しない文字列を高速で効率的に保存する

私はList<string>を試しましたが、大文字と小文字が区別されます。私は大文字小文字を区別しないでくださいDictionary<TKey, T>を使用する必要がありますが、それはスペースの無駄のように感じます。各文字列にToLower()を実行すると、パフォーマンスが低下します。

どのような種類の.Netコレクションを使用すべきか知っていますか?

+0

「房の束」と言いますと、何回話していますか? –

+0

あなたが以前に試みたようにListを使用し、Contains –

+0

+/- 10kのアイテムを呼び出すときにSLaksと述べたようにStringComparer.OrdinalIgnoreCaseを渡すことができます。このコレクションを頻繁にクイズする必要があります。 –

答えて

18

new HashSet<string>(StringComparer.OrdinalIgnoreCase)を使用してください。
これは順序なしのセットです。

+0

順序付けられていないセットのパフォーマンスの意味は何ですか?そこに注文版がありますか? –

+0

無秩序なコレクションは、要求がより緩慢であるため、常に順序付けされたコレクションよりも速くなります。 – Blindy

+1

ドキュメントには、ContainsとRemoveがO(1)操作であると書かれています。 http://msdn.microsoft.com/en-us/library/bb383091%28v=VS.90%29.aspx – Greg

2

StringDictionaryを使用できます。

+3

これは値の無駄です。 – SLaks

+0

確かに、あなたは、おそらくそれが適切でないかもしれないテキストを挿入するテキストと異なるテキストでキー入力していないと思います。 – Reddog

+0

私たちはまだメモリ内の二重値の問題を抱えています。 –

-1

大文字と小文字を区別しない比較を行う独自のContains()Remove()メソッドを記述します。

+0

解決策はどのように提案されているHashSet よりも速いのですか? –

+0

おそらくそうではありません。 – Nate

+0

フレームワークに比較対象が既に存在する拡張メソッドが含まれています。 –

0

今日解決する同じ問題がありました。 Linqを含めることができれば、リストは比較演算子でオーバーロードされたメソッドを取得します。で、大文字と小文字が区別されないデフォルトの辞書によって マーティン

+0

LINQは3.5ですが、2.0用に開発しています。あなたのソリューションの問題は、containsがO(N)をとり、remove関数がないことです。 HashSet が最高のパフォーマンスを発揮するようです。 –

0

using System.Linq; 

List<string> stringList = new List<string>(); 
stringList.Contains("hello", StringComparer.OrdinalIgnoreCase); 

希望はこのことができます。しかし、独自のバリアントを実装して、それを機密にすることができます。 (私は間違っているかもしれません:D)

私は辞書で同じ問題を抱えていましたが、多くのIEqualityの実装を試した後、最終的に私はLINQでスコアを解決しました。

string k = customers.Where(c => c.Key.Equals(valueToSearch, StringComparison.OrdinalIgnoreCase)).FirstOrDefault().Key; 

if (!string.IsNullOrEmpty(k) && k.ToUpper() == valueToSearch.ToUpper()) 
{ 
    // Do some thing 
} 

これは将来的に誰かを助けることを望みます。

Sanjay Zalke

+0

コメントありがとうございます。辞書の問題は、キーと値のペアがあることです。私は、文字列が存在するかどうかを知る必要があります。 「価値」の部分は必要ありません。だから、辞書を使うとメモリ空間が浪費される。 –

+0

こんにちはKees、この実装はまったく辞書に関連していませんが、データベースを含む.netのすべてのオブジェクトに適用されるようにLINQです。あなたがリストを使用している場合:[コード](文字列k = customers.Where(c => c.Equals(valueToSearch、StringComparison.OrdinalIgnoreCase))。FirstOrDefault();) –

+0

ああ、それを得た。問題は私が.Net 2.0を使用していることです。それでも、新しいHashSet (StringComparer.OrdinalIgnoreCase)はO(1)のように最速です。あなたのコードはforを使用し、O(N)にします。 –

関連する問題