DataTable中最接近的值

时间:2016-07-21 11:04:48

标签: c# wpf linq datatable

我目前正在尝试通过将另一列的值与参考编号进行比较来查找列的值。

让我解释一下:

我有一个包含2列的DataTable。

ID    DATA
1     120
2     200
3     -60
4     478

我想找到最接近0的DATA的ID。

在这种情况下,正确的值将是-60和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();

有人可以帮助我吗?

2 个答案:

答案 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 To Objects方法。使用MoreLINQ它甚至更简单:

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

答案 1 :(得分:0)

按绝对值排序,然后选择第一个

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