2011-09-14 43 views
2

我的一位同事正在尋找類似於從列表中爲給定值拾取前一個值和下一個值的東西。我用谷歌的一些幫助寫了一個小函數,但是我想看看 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這裏沒有'break's - 每個項目都會被檢查,所以它不需要先排序。整個列表將被掃描,並且最近的兩個鄰居返回 – AakashM

+0

是的,謝謝Botz和Aakash! – Pak