Это, вероятно, полуэффективный способ сделать это (в зависимости от данных он может быть более эффективным без сортировки):
var test = new List<int>() { 2, 1, 4, 8 };
int referenceNumber = 5;
int closestLowerNumber = 0;
int closestHigherNumber = 0;
foreach (var val in test.OrderBy(v => v))
{
if (val < referenceNumber)
{
closestLowerNumber = val;
}
else if (val > referenceNumber)
{
closestHigherNumber = val;
break;
}
}
Console.WriteLine(string.Format("Closest low: {0}, Closest high: {1}, Distance low: {2}, Distance high: {3}", closestLowerNumber, closestHigherNumber, (referenceNumber - closestLowerNumber), (closestHigherNumber - referenceNumber)));
Выходы:
Closest low: 4, Closest high: 8, Distance low: 1, Distance high: 3
Попробуйте онлайн
Обратите внимание, что предполагается, что по крайней мере на 1 число меньше, а на 1 больше.Если это не так, closestLowerNumber
или closestHigherNumber
останется 0 и даст странные результаты.Поэтому, вероятно, разумно вместо этого использовать nullable int, чтобы вы могли проверить, установлено ли оно (int? closestLowerNumber
) с помощью closestLowerNumber.HasValue
.