2009-03-26 3 views
2

주어진 숫자에 대해 배열에서 가장 가까운 숫자 ("크거나 같음"및 "작거나 같음")를 찾을 linq 표현식이 필요합니다.배열의 주변 숫자에 대한 Linq 표현

예. 배열 - 1, 33, 66, 100

숫자가 10 인 경우 1과 33을 반환하고, 숫자가 70 인 경우 66을 반환하고 싶습니다. 숫자가 33 인 경우 33 및 66을 반환하고 싶습니다.

기본 루프를 사용하여이 작업을 수행 할 수 있지만 데이터베이스의 숫자에 대한 연산이므로 linq 대신 SQL 식을 사용하는 것이 좋습니다.

편집 : 나는 실제로 이것을 달성하기 위해 단일 LINQ 표현을 찾고 있었다, 그러나 아마 조금 희망 : 1

답변

4

Andrews 대답과 비슷하지만 OrderBy 전에 필터를 사용하면 쿼리가 실행해야하는 데이터 양이 줄어 듭니다. 또한 OrderBy.First는 Min과 동일하고 OrderByDescending.First는 Max와 같습니다.

var high = list 
    .Where(i => i > n) 
    .DefaultIfEmpty() 
    .Min(); 

var low = list 
    .Where(i => i <= n) 
    .DefaultIfEmpty() 
    .Max(); 
+0

결국 이것은 SQL에서 실행됩니다. 이것이 작동 순서 및 순서에 어떤 영향을 줍니까? 그것은 좋은 테스트지만 결국 추측, 그들은 동일 것인가? – andleer

1
var list = new[] { 1, 33, 66, 100 }; 

var n = 33; 

var high = list 
    .OrderBy(i=>i) 
    .FirstOrDefault(i => i >= n); 

var low = list 
    .OrderByDescending(i => i) 
    .FirstOrDefault(i => i <= n); 

Console.WriteLine(low); 
Console.WriteLine(high); 

결과, 33

유일한 문제가되고 있었다 n에 33을 지정하면 33, 33이됩니다. 맞습니까? 둘 다 같은 숫자 일 수 있습니까? 그렇지 않다면 선택을 "< ="으로 제한하고 ">"로 제한해야합니다.

당신은 솔루션을 Linq에 맞게 SQL에 적용 할 수 있어야합니다.

0
 ArrayList arrList = new ArrayList(); 
     int number = 10; 

     arrList.Add(1); 
     arrList.Add(10); 
     arrList.Add(20); 
     arrList.Add(-12); 

     int numberBelow = (from int i in arrList 
          where i <= number 
          select i).Max(); 

     int numberAbove = (from int i in arrList 
          where i >= number 
          select i).Min(); 

아래의 숫자는 검색 값보다 작은 최대 값이며 위의 숫자는 검색 값보다 큰 최소값입니다. 유일한 질문은 당신이보다 크거나 같거나 더 큽니다.