2011-09-14 1 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 여기에는 '중단'이 없습니다. 모든 항목이 검사되므로 먼저 정렬 할 필요가 없습니다. 전체 목록이 스캔되고 가장 가까운 두 이웃은 – AakashM

+0

을 반환합니다. 예, Botz 및 Aakash에게 감사합니다. – Pak