私はこのようないくつかの識別子のリストを持っています。ソート別のリストIDからリストは
List<T> docs = GetDocsFromDb(...)
私はList<T>
内の項目は、(エンジン得点の理由を検索することにより)最初の1に比べて同じ位置になければならないように、両方のコレクションで同じ順序を維持する必要があります。そして、このプロセスはGetDocsFromDb()
機能では実行できません。
必要に応じて、2番目のリストを他の構造(たとえばDictionary<long, T>
)に変更することはできますが、変更しないことをお勧めします。
は、LINQで、この「いくつかのIDに応じて、ordenation」を行うための任意の単純かつ効率的な方法はありますか?あなたは
IEnumerable<T> OrderBySequence<T, TId>(
this IEnumerable<T> source,
IEnumerable<TId> order,
Func<T, TId> idSelector)
{
var lookup = source.ToDictionary(idSelector, t => t);
foreach (var id in order)
{
yield return lookup[id];
}
}
が何をしたいのための一般的な拡張である、T
を指定していないので
List<T> docs = GetDocsFromDb(...).Zip(docIds, Tuple.Create)
.OrderBy(x => x.Item2).Select(x => x.Item1).ToList();
あなたはすべての 'docId'がdocs''に一度だけ発生することを保証され、どのようなプロパティが 'Id'またはセレクタ' funcが '必要になりますを開催しますか! –
Jodrell
最初のリストは「マスターリスト」を表していますか?別の言葉では、第2のリストは、第1のリストの一部(または全体)を表すサブセットであろうか? – code4life