2016-07-21 4 views
0

현재 다른 열의 값과 참조 번호를 비교하여 열의 값을 찾으려고합니다.DataTable에서 가장 가까운 값

설명해 드리죠 :

내가 2 열이있는 DataTable에 있습니다.

ID DATA 
1  120 
2  200 
3  -60 
4  478 

나는 올바른 값이 -60있을 것 DATA이 경우

0에서 가장 가까운의 ID와 ID를 찾으려면 실제로 할 3

int closestId = dtQueryLambda.AsEnumerable().Where(x => x.Field<double> ("DATA") > 0 || 
                 x.Field<double>("DATA") < 0) 
    .Select(x => x.Field<Int32>("ID")) 
    .First(); 

누군가 나를 도울 수 있습니까?

+0

을 선택? –

+0

다음 단계에서 다른 데이터 테이블에서 데이터의 인덱스를 찾으십시오. 대상 번호가 이전 결과의 데이터가 될 것입니다. –

답변

1

이 같은 Aggregate 방법을 사용할 수 있습니다 :

double baseValue = 0; // or something else 
int closestId = dtQueryLambda.AsEnumerable() 
    .Select(dr => new 
    { 
     Id = dr.Field<int>("ID"), 
     Diff = Math.Abs(dr.Field<double>("DATA") - baseValue) 
    }) 
    .Aggregate((a, b) => b.Diff < a.Diff ? b : a).Id; 

위는 객체 접근 할 수있는 효율적인 표준 LINQ이다. MoreLINQ로 그것도 간단 : 절대 값으로

int closestId = dtQueryLambda.AsEnumerable() 
    .MinBy(dr => Math.Abs(dr.Field<double>("DATA") - baseValue)) 
    .Field<int>("ID"); 
+0

두 번째 해결책은 제가 생각하기에 최선이지만 MinBy를 사용할 수 없습니다 함수에 대한 EnumerableRowCollection

+0

왜 안 되니? 그것은'IEnumerable '을 구현하고 있으므로, 어떤 확장 메소드도 동작해야합니다. –

0

정렬 한 후 어떤 분을 받고 다음 절대 값을 받고 대해 처음

var closestId = dtQueryLambda.AsEnumerable() 
    .OrderBy(x => Math.Abs(x.Field<double>("DATA"))) 
    .Select(x => x.Field<Int32>("ID")) 
    .First(); 
관련 문제