です辞書(長さN)の上に最初を列挙し、包含のためにリスト(長さM)をチェックし、その後、あなたはO(NM)の性能を得ることができます。
あなたはIDのHashSet<>
を構築することができますが、我々はすでに利用可能(事前にハッシュされた)辞書を持っているので、それは冗長なようです。
代わりに、最初にIDを反復処理します。しかし、これはLINQを使用しないことを意味するかもしれません(TryGetValue
はLINQを愛しません(そして、タプルをあまりにも多く導入するとハードワークのような)...
Dictionary<string, string> getValidIds(
IDictionary<string, string> salesPersons,
IEnumerable<string> ids) {
var result = new Dictionary<string, string>();
string value;
foreach (string key in ids) {
if (salesPersons.TryGetValue(key, out value)) {
result.Add(key, value);
}
}
return result;
}
それが過度これはLINQのバージョンよりも多くの行であることを私には関係しませんが、それは複雑さのO(N)を削除...
編集する;次のが(私はそれをテストしていない)の仕事かもしれないが、私はLINQの乱用だと思うし、確かにPLINQなどに拡大しないだろう...極端な注意と使用! foreach
アプローチは、単純に少ないオーバーヘッドを持っているので、とにかく...速くなります。
Dictionary<string, string> getValidIds(
IDictionary<string, string> salesPersons,
IEnumerable<string> ids)
{
string value = null;
return (from key in ids
where salesPersons.TryGetValue(key, out value) // HACK: v. dodgy
select new { key, value })
.ToDictionary(x=>x.key, x=>x.value);
}
私はあなたがこの種のものでPERF心配している場合は、それがあるように、メモリ内あまりにも多くを持っていると思いますが、マルク、 –
1 ...パフォーマンスのノートのための私の返事を参照してください! :) –
@Matt ...まあ、多分 - しかし、O(1)/ O(N *ログ(N))* *は不合理ではなく、O(N^2)*はある点が、A *あり問題は、それが1k、10k、100kかどうかはもちろん、特定のプロセスまでです。 –