我需要一个linq表达式,它会在给定数字的数组中找到最接近的数字(“大于或等于”和“小于或等于”)。
E.g。 数组 - 1,33,66,100
如果我有10号,我想要返回1和33.如果我有70号,我想要返回66和100.如果我有33号,我想返回33和66。
我可以用某种基本的for循环来做这个,但这是对数据库中的数字的操作,所以我更喜欢linq到sql表达式。
编辑:我实际上是在搜索单个 linq表达式来实现这一点,但也许我有点希望:)
答案 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();
下面的数字是小于搜索值的最大值,同样上面的数字是大于搜索值的最小值。唯一的问题是你想要大于或等于或大于。