2011-09-14 30 views
2

私の同僚の一人は、指定された値のリストから前後の値を取得するようなものを探していました。私は働いているGoogleの助けを借りて少し機能を書いたが、私は を見たいと思っていた1.これはこれを行う効率的な方法は? 2.これを行うためのLINQの方法は他にありますか?ちょうど単一の項目は私が不審になるだろう見つけるために発注LINQを使って前と次の要素を取得する

private static List<double> GetHighLow(double value) 
    { 
     List<double> tenorList = new List<double> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 15, 20, 30 }; 

     double previous = tenorList.OrderByDescending(s => s).Where(s => s.CompareTo(value) < 0).FirstOrDefault(); 
     double next = tenorList.OrderBy(s => s).Where(s => s.CompareTo(value) > 0).FirstOrDefault(); 

     List<double> values = new List<double> { previous, next }; 
     return values; 
    } 

おかげ 朴

+0

は既にソートされていることが保証されているソースリストですか? – AakashM

+0

これについてのブログを少し前に書きました。 http://trikks.wordpress.com/2011/12/01/getting-the-previous-and-next-record-from-list-using-linq/ –

+0

@Trikksはい、あなたの解決策はよりクリーンです。共有してくれてありがとう。 – Pak

答えて

3

。 このように線形時間で行うことができます:

double prev = double.MinValue; 
double nx = double.MaxValue; 
foreach (var item in tenorList) { 
    if (item < value && item > prev) { prev = item; } 
    if (item > value && item < nx) { nx = item; } 
} 

List<double> values = new List<double> { prev, nx }; 
+0

これは私の方法よりも明らかに優れています。しかし、私は 'foreach'ループの前に、私はtenorListをソートしなければならないと思います。あれは正しいですか? – Pak

+1

@Pakここには「休憩」はありません。すべての項目が検査されるので、最初にソートする必要はありません。リスト全体がスキャンされ、2つの最も近い隣人が返されます – AakashM

+0

はい、ありがとうございますBotzとAakash! – Pak

関連する問題