2011-07-18 10 views
1

文字列が含まれているかどうかを確認するために必要な電子メールのリストがあります。私はこれを一度だけ行う必要があります。私はもともと、電子メールが電子メールのリストからの電子メールのいずれかと一致するかどうかを確認する必要があります。HashSetまたはインデックスを返すHashSet.Containsに相当しますか?

私はこれは素晴らしい仕事 if(ListOfEmailsToRemoveHashSet.Contains(email)) { Discard(email); }を使用していたが、今私は、部分的な一致を確認する必要があるので、私はそれを反転しようとしていますが、私は同じ方法を使用した場合、私は...のような if (ListOfEmailsHashSet.Contains(badstring)それをテストすることになります。明らかに、どの文字列が見つかっているのかが分かりますが、ハッシュセットのどのインデックスに不正な文字列が含まれているのかはわかりません。

私はこの作業をまだ高速にしているようには見えません。

マッチのハッシュセット、一致したアイテムのインデックス、またはこれを回避するために使用できる関数を知っている人はいますか?

+1

....私はこれを共有するだろうと思ったあなたは[文字列を混乱しているよう少し聞こえます。含まれています](http://msdn.microsoft.com/en-us/library/dy85x1sa.aspx)と[HashSet.Contains](http://msdn.microsoft.com/en-us/library/bb356440.aspx) 。これらの違いを明確にするために質問を言い換えることができますか?多分例を挙げることができますか? – dtb

+0

HashSetがHashSet であると言えば、違いがありますか? – Kin

答えて

2

これは一度だけ行う必要があります。

このような場合は、パフォーマンスを考慮する必要はありません。このような何かが動作するはずです:サイドノートで

if(StringsToDisallow.Any(be => email.Contains(be))) {...} 

を、あなたは正規表現ではなく、含まれる文字列のストレートブラックリストを使用して検討する必要があります。彼らはより強力で柔軟なマッチを見つける方法をあなたに提供します。

パフォーマンスは、すべての後の問題であることが判明した場合は、フルテキスト検索のためのより良い作品のデータ構造を見つける必要があります。 Lucene.NETのような既存のツールを活用するのが最適かもしれません。ここだけのノート

+0

私はそれを何度もやる必要がありますが、各リストに1回だけ、私はリストの束を持っています。私はそれを試みます。なぜ私がデータベースを使用していないのか、私に尋ねるのをやめさせるために、一度追加しました。これは、同様のケースについて私が尋ねた最後の質問で起こりました。 – Kin

+0

それはかなりうまくいくように見えました。 – Kin

+0

ここにユーザーエラーがあり、動作していません。私が間違っていない限り、各リストには時間がかかるようです。 – Kin

0

は、我々が100,000 PDF /エクセル/ DOCなどのアップロード過剰使命を帯びたプログラムを持っていた、毎回ファイルには、エントリをテキストファイルで作成されましたアップロードされました。毎晩プログラムが実行されたときに、このファイルを読み込み、レコードをロードしてstatic HashSet<string> FilesVisited = new HashSet<string>(); FilesVisited.Add(reader.ReadLine());に追加します。プログラムがファイルをアップロードしようとしたとき

は、我々は最初に、我々はすでにファイルに働いていたかどうかを確認するためにHashSetをスキャンしなければなりませんでした。私たちが発見したの if (!FilesVisited.Contains(newFilePath))...は多くの時間がかかるだろうし、私達に正しい結果が得られないだろうということでした(ファイルパスがそこにあった場合でも)を交互に、FilesVisited.Any(m => m.Contains(newFilePath))も遅い運転でした。

私たちは、高速であることが判明最良の方法は、

foreach (var item in FilesVisited) 
    { 
    if (item.Contains(fileName)) { 
     alreadyUploded = true; 
     break; 
    } 
    } 

の伝統的な方法だったちょうどあなたの質問は

関連する問題