假设我有这个号码表:

List<int> = new List<int>(){3,5,8,11,12,13,14,21}

假设我想得到最接近的小于11的数字,它应该是8
假设我想得到最接近的数字,大于13,等于14。
列表中的数字不能复制,总是排序。我该怎么写LINQ呢?

最佳答案

如果linq假设列表是有序的,我会这样做:

var l = new List<int>() { 3, 5, 8, 11, 12, 13, 14, 21 };
var lessThan11 = l.TakeWhile(p => p < 11).Last();
var greaterThan13 = l.SkipWhile(p => p <= 13).First();

编辑:
由于我收到了关于这个答案的负面反馈,并且为了那些可能看到这个答案的人,虽然它被接受了,但不要再进一步了,我研究了关于BinarySearch的其他评论,并决定在这里添加第二个选项(有一些小的改变)。
在其他地方,这是不够的:
var l = new List<int>() { 3, 5, 8, 11, 12, 13, 14, 21 };
var indexLessThan11 = ~l.BinarySearch(10) -1;
var value = l[indexLessThan11];

现在,上面的代码无法处理值10实际上可能在列表中的事实(在这种情况下,不应该反转索引)!所以好办法是:
var l = new List<int>() { 3, 5, 8, 11, 12, 13, 14, 21 };
var indexLessThan11 = l.BinarySearch(10);
if (indexLessThan11 < 0) // the value 10 wasn't found
{
    indexLessThan11 = ~indexLessThan11;
    indexLessThan11 -= 1;
}
var value = l[indexLessThan11];

我只想指出:
l.BinarySearch(11) == 3
//and
l.BinarySearch(10) == -4;

关于c# - LINQ查找大于/小于输入的最接近的数字,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6436246/

10-10 22:56