从 int 列表中获取最大最接近的数字
Posted
技术标签:
【中文标题】从 int 列表中获取最大最接近的数字【英文标题】:Get maximum closest number from int list 【发布时间】:2022-01-16 17:19:08 【问题描述】:我有如下号码列表,我应该检查一个条件以获得最合适的匹配。
List<int> numbers= new List<int>();
numbers.Add(1000);
numbers.Add(3000);
numbers.Add(5500);
numbers.Add(7000);
如果我发送一个值来检查它应该像下面的例子一样检查
场景 1: 如果我发送一个小于或等于 1000 的值进行检查,它应该返回 1000
场景 2: 如果我发送一个 1001 - 3000 之间的值进行检查,它应该返回 3000
场景 3: 如果我发送一个介于 3001 - 5500 之间的值进行检查,它应该返回 5500
场景 4: 如果我发送一个介于 5501 - 7000 之间的值进行检查,它应该返回 7000
场景 5: 如果我发送一个高于 7000 的值进行检查,它应该什么也不返回。
我可以用 Linq 做到这一点吗?或者最有效的方法是什么?
更新:maxCheckPoint 中的数字是动态的,可以是任何值。所以我们不能硬编码和检查
【问题讨论】:
请不要定义任何内容。你的意思是null
?
@Llama 是的。 null 没关系:)
看起来您可以从 maxCheckPoint.Where(num => num > whatever).Min()
开始并从那里改进它。你尝试了什么? minimal reproducible example?你的问题在哪里?
【参考方案1】:
你可以用 LINQ 做到这一点:
int input = 1000;
int? result = numbers
.OrderBy(n => n) // get the numbers in ascending order
.SkipWhile(n => n < input) // skip until the remaining set >= input
.Cast<int?>() // cast to nullable int
.FirstOrDefault(); // take the first or default entry (if no items remain, it will be null)
【讨论】:
【参考方案2】:好吧,为时已晚,我的解决方案远非完美,但是:
int number = 400; //imput number
int closest = numbers.Aggregate((x, y) => Math.Abs(x - number) < Math.Abs(y - number) ? x : y); // searching the closer one
int compare;
try
if (numbers.IndexOf(closest) != 0)
compare = Math.Max(closest, numbers[numbers.IndexOf(closest) + 1]); // if it's not 0th and last
else
compare = closest; // if closest with index 0
// check which closest number is bigger
catch
compare = closest; // if closest is last
Console.WriteLine(compare);
【讨论】:
以上是关于从 int 列表中获取最大最接近的数字的主要内容,如果未能解决你的问题,请参考以下文章
当我从参数接收到 Iterable 时,如何使用带有 java8 的 Lamba 表达式从给定值中找到最接近的数字? [复制]