Linq表达式中包含数组中的周围数字

时间:2009-03-26 22:37:26

标签: linq linq-to-sql

我需要一个linq表达式,它会在给定数字的数组中找到最接近的数字(“大于或等于”和“小于或等于”)。

E.g。 数组 - 1,33,66,100

如果我有10号,我想要返回1和33.如果我有70号,我想要返回66和100.如果我有33号,我想返回33和66。

我可以用某种基本的for循环来做这个,但这是对数据库中的数字的操作,所以我更喜欢linq到sql表达式。

编辑:我实际上是在搜索单个 linq表达式来实现这一点,但也许我有点希望:)

3 个答案:

答案 0 :(得分:4)

类似于安德鲁斯的答案,但我更喜欢在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();

答案 1 :(得分: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);

结果为1,33

唯一的问题是如果你为n指定33,你会得到33,33。这是正确的吗?两者都可以是相同的数字吗?如果没有,您必须将您的选择限制为“&lt; =”然后只是“&gt;”。

您应该能够使解决方案适应Linq to SQL。

答案 2 :(得分: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();

下面的数字是小于搜索值的最大值,同样上面的数字是大于搜索值的最小值。唯一的问题是你想要大于或等于或大于。