2012-02-25 24 views
3

私は過去2日間で壁に頭をぶつけていましたが、次のLINQのタイミングを改善することができません。LINQクエリの改善

from obj in list 
from obj1 in list1 
where (obj1.ClassesName.Contains(obj.ClassName) && obj1.Count> 0) 
select new { result = obj1.ClassName}) 

私はobj.classnameでobj1.classesnameリストを検索する必要があります。クラス名リストに見つかったら、obj1クラス名を返す必要があります。

私はリストに5千のオブジェクトを持っています。

上記のクエリの実行には30秒以上かかります。私はこの時間を5秒以下で切る必要があります。

私は混乱しており、あらゆる援助がカウントされます。

ありがとうございます。これは、それが一致するものを見つけたときに探して停止します

+0

代わりに通常のループを使ってみましたか?私はLINQクエリが遅く実行されているし、私はちょうど通常の構造でそれらを置き換えて、彼らは時々より速く実行します。 –

+1

これはちょうど1つの結果を返す必要がありますか?または多くの結果? –

+0

「ClassesName」の型が(文字列か文字列か)明確ではなく、Containsが部分文字列またはコレクション操作を意味する場合は、サンプルデータと期待される出力が役立つと思います。コレクションの場合、大文字と小文字を区別する必要はありませんか? obj1.Countは何を参照していますか? –

答えて

0
(from obj1 in list1 
where (obj1.Count > 0) && System.Linq.Enumerable.Any(from obj in list where obj1.ClassesName.Contains(obj.ClassName) select obj) 
select new { result = obj1.ClassName}); 

が、どれが何thatsの、これはあなたが通過探してレコードの数を減らすだろうが、多分私はあなたが達成しようとしているのかを理解していません。

+0

なぜそれが速いのですか? (ちょっと興味があるんだけど)。 –

+2

System.Linq.Enumerable.Anyは結果が見つかると停止します –

+0

なぜ拡張メソッドの代わりに静的メソッドとして呼び出すのですか?変わったIMHOと思われる:) –

1

1つの明らかな改善は、あなたがすべてでそれらの項目を検討する必要はありませんので、アウトlist1ためCount > 0条件を移動することです:

from obj in list 
from obj1 in list1.Where(x=> x.Count >0) 
where (obj1.ClassesName.Contains(obj.ClassName)) 
select new { result = obj1.ClassName}) 

ClassesNameは、あなたのようにいくつかの前処理を行うことができますList<string>あるので、代わりにHashtable<string>を使用してください。これはO(n)の代わりにルックアップO(1)を行い、list1の項目数をnとします。

関連する問題