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();
EDIT:
由于我收到了关于这个答案的负面反馈,并且为了可能看到这个答案的人,虽然它已被接受,但不要进一步进行,我探索了有关 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;