LINQを使用しているコードのセクションでわずかなパフォーマンスの問題が発生し、ルックアップに関してLINQがどのように機能するかについて疑問が生じました。
私の質問はこれです(私はすべてのコードを変更したので、これは実際のシナリオではなく、コードの例示的な例であることに注意してください):
与えられた
public class Person {
int ID;
string Name;
DateTime Birthday;
int OrganisationID;
}
たとえば100kのPersonオブジェクトのリストと、たとえば1000の日付のリストがあり、次のコードを実行した場合:
var personBirthdays = from Person p in personList
where p.OrganisationID = 123
select p.Birthday;
foreach (DateTime d in dateList)
{
if (personBirthdays.Contains(d))
Console.WriteLine(string.Format("Date: {0} has a Birthday", d.ToShortDateString()));
}
結果のコードは、次の反復になります。
100k(organisationID 123のユーザーを見つけるために実行する必要のあるループ)
×
1000(リスト内の日付の量)
×x(日付についてチェックされるorganisationID 123を持つユーザーの数
)
)。
これはたくさんの繰り返しです!
コードをpersonBirthdaysに変更した場合:
List<DateTime> personBirthdays =
(from Person p in personList
where p.OrganisationID = 123
select p.Birthday).ToList();
これにより、100kが倍数として削除され、1回だけ実行されますか?
したがって、(100k * 1000 * x)の代わりに100k +(1000 * x)になります。
問題は、これは簡単すぎるように思われることです。LINQは、これが起こらないことを意味するはずの巧妙なことをどこかで行っていると確信しています。
誰も答えない場合は、いくつかのテストを実行して報告します。
明確性の更新:
データベースルックアップは考慮していませんpersonList
。オブジェクトはメモリ内リストオブジェクトです。これはすべてLINQ-to-Objectsです。