3つの列を含む汎用リスト(またはIQueryable)を検索しています。1と2に基づいて3列の値を見つけようとしていますが、検索が非常に遅くなります。単一の検索の場合、速度は目立ちませんが、この検索をループで実行しています。700回の反復では、合計で2分以上かかるため、使用できません。列1と2はint
であり、列3はdouble
です。これが私が使用しているlinqです:
public static Distance FindByStartAndEnd(int start, int end, IQueryable<Distance> distanceList)
{
Distance item = distanceList.Where(h => h.Start == start && h.End == end).FirstOrDefault();
return item ;
}
IQueryableリストには最大60,000のエントリが存在する可能性があります。それはかなり多いことは知っていますが、検索に問題が生じるとは思いませんでした。
だから私の質問は、3分の1の値を取得するために2つの列を一致させる必要があるときにコレクションを検索するためのより良い方法はありますか?700回の検索すべてをほぼ瞬時に行う必要があると思いますが、それぞれに約300ミリ秒かかり、すぐに増加します。
更新-最終解決策#######################
Tuple
これで、 withstart
とキーをキーとして使用して辞書を作成しましたend
。これが正しい解決策になると思います。
var dictionary = new Dictionary<Tuple<int, int>, double>();
var key = new Tuple<int, int>(Convert.ToInt32(reader[0]), Convert.ToInt32(reader[1]));
var value = Convert.ToDouble(reader[2]);
if (value <= distance)
{
dictionary.Add(key, value);
}
var key = new Tuple<int, int>(5, 20);
正常に動作します-はるかに高速です