2012-01-23 7 views
1

メモリリストのエンティティの一部を.contains(subselect)クエリと照合して、新しいユーザーから古いものを除外します。私はこの見たパフォーマンスの問題のチェックこのlinqをオブジェクトクエリに最適化するにはどうすればよいですか?

:新しいリストは100から500に変化しながらoldListは主に、それらに約1000ユーザーがいる

enter image description here

は、このクエリを最適化する方法はありますか?絶対

+1

1の回答は12です。それを改善したいかもしれない。また、どのアドオンがそのメトリックを提供していますか? – Yuck

+0

私はvs2010のパフォーマンスプロファイラを使用しました。これには究極のバージョンが付属しています。 –

答えて

3

- リストを毎回確認セットの代わりの構築:

// Change string to whatever the type of UserID is. 
var oldUserSet = new HashSet<string>(oldList.Select(o => o.UserID)); 
var newUsers = NewList.Where(n => !oldUserSet.Contains(n.UserID)) 
         .ToList(); 

HashSetに封じ込めチェックがOであるべきである(1)に代えて検査のO(N)のうち、いくつかのハッシュ衝突を想定し各シーケンスは(新しいユーザーごとに)シーケンス全体に対して実行されます。

2

事前にユーザーIDのHashSet<T>を作成することができます。これはContainsはO(1)操作になる場合があります。

var oldSet = new HashSet<int>(oldList.Select(o => o.UserID)); 
var newUsers = NewList.Where(n => !oldSet.Contains(n.UserID)).ToList(); 
0

それらHashSet<T>答えは簡単でシンプルですが、いくつかは、LINQ中心のソリューションを好むかもしれません。

LinqToObjectsは、joinおよびGroupJoinをHashSetで実装しています。これらのうちの1つを使用してください。この例ではGroupJoinを使用しています:

List<User> newUsers = 
    (
    from n in NewList 
    join o in oldList on n.UserId equals o.UserId into oldGroup 
    where !oldGroup.Any() 
    select n 
).ToList() 
関連する問題