2016-07-21 14 views
0

現在、別の列の値を参照番号と比較して列の値を検索しようとしています。DataTableの最も近い値

私に説明してみましょう:

私は2列を持つDataTableのを持っています。

ID DATA 
1  120 
2  200 
3  -60 
4  478 

私は正しい値が-60されるデータこの場合

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

何を選択:MoreLINQではそれも簡単ですか! –

+0

次のステップでは、他のDataTableで、ターゲット番号が前の結果のデータになるデータのインデックスを見つけます。 –

答えて

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です。絶対値で

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

2番目の解決策は私が思うには最高ですが、MinByを使用することはできません関数EnumerableRowCollectionの

+0

なぜですか?これは 'IEnumerable 'を実装しているので、どの拡張メソッドも動作するはずです。 –

0

ソートして、絶対値を取得してから分を取得する方法について最初

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