メモリリストのエンティティの一部を.contains(subselect)クエリと照合して、新しいユーザーから古いものを除外します。私はこの見たパフォーマンスの問題のチェックこのlinqをオブジェクトクエリに最適化するにはどうすればよいですか?
:新しいリストは100から500に変化しながらoldListは主に、それらに約1000ユーザーがいる
は、このクエリを最適化する方法はありますか?絶対
メモリリストのエンティティの一部を.contains(subselect)クエリと照合して、新しいユーザーから古いものを除外します。私はこの見たパフォーマンスの問題のチェックこのlinqをオブジェクトクエリに最適化するにはどうすればよいですか?
:新しいリストは100から500に変化しながらoldListは主に、それらに約1000ユーザーがいる
は、このクエリを最適化する方法はありますか?絶対
- リストを毎回確認セットの代わりの構築:
// 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)のうち、いくつかのハッシュ衝突を想定し各シーケンスは(新しいユーザーごとに)シーケンス全体に対して実行されます。
事前にユーザー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();
それら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()
1の回答は12です。それを改善したいかもしれない。また、どのアドオンがそのメトリックを提供していますか? – Yuck
私はvs2010のパフォーマンスプロファイラを使用しました。これには究極のバージョンが付属しています。 –