我有这样的数字列表:{100, 150, 200, 250, 300, 350, 400, 450}
如何通过给定的数字查找介于它们之间的最低和最高数字?
示例:
x = 90
并且期望的输出是100
。x = 120
,则期望的输出为100, 150
x = 150
,则期望的输出为150
x = 151
,则期望的输出为150, 200
x = 420
,则期望的输出为400, 450
x = 450
,则期望的输出为450
x = 451
,则期望的输出为> 450
代码:
我尝试使用Windows应用( C#),但是结果不准确。
private void GetRangeList()
{
string givenValue = txtgivenValue.Text.ToString();
long givenValueNumber = long.Parse(txtgivenValue.Text.ToString().Trim());
var numbers = new List<long> { 100, 150, 200, 250, 300, 350, 400, 450 };
var lowest = numbers.Where(n => n <= givenValueNumber).Max().ToString();
var highest = string.Empty;
if (givenValueNumber < 450)
{
highest = numbers.Where(n => n >= givenValueNumber).Min().ToString();
}
lblOutput.Text = lowest.ToString() + ", " + highest.ToString();
}
答案 0 :(得分:3)
请注意,空光标上的Max()
/ Min()
抛出异常:
long givenValueNumber = 90;
var numbers = new List<long> { 100, 150, 200, 250, 300 , 350 , 400 , 450 };
// n => n <= givenValueNumber condition makes the cursor empty
// Max() will throw exception
var lowest = numbers.Where(n => n <= givenValueNumber).Max();
这个事实可能是您遇到的主要困难;但是,一个简单的foreach
循环就足够了。唯一(小的)困难是在所有可能的情况下以正确格式返回结果:
// IEnumerable<long> be nice and accept any enumerable data source;
// say, array, list etc.
private static string TheRange(IEnumerable<long> data, long target) {
long? lower = null;
long? upper = null;
// all we have to do is to enumerate the data while updating lower and upper
// bounds in the process
foreach (var item in data) {
if (item <= target && (!lower.HasValue || item > lower))
lower = item;
if (item >= target && (!upper.HasValue || item < upper))
upper = item;
}
// we have upper and lower bound; time to return them in the right format
if (!lower.HasValue)
if (!upper.HasValue)
return $"Empty array";
else
return $"< {upper}";
else if (!upper.HasValue)
return $"> {lower}";
else if (lower == upper)
return $"{lower}";
else
return $"{lower}, {upper}";
}
让我们看看:
using System.Linq; // for testing only
...
var numbers = new List<long> { 100, 150, 200, 250, 300, 350, 400, 450 };
long[] tests = new long[] {
90, 120, 150, 151, 420, 450, 451
};
string report = string.Join(Environment.NewLine, tests
.Select(test => $"{test, 3} :: {TheRange(numbers, test)}"));
Console.Write(report);
结果:
90 :: < 100
120 :: 100, 150
150 :: 150
151 :: 150, 200
420 :: 400, 450
450 :: 450
451 :: > 450
最后,GetRangeList()
可以实现如下
private void GetRangeList() {
var numbers = new List<long> { 100, 150, 200, 250, 300, 350, 400, 450 };
// 1. txtgivenValue.Text is pf type string, ToString() is redundant
// 2. Parse is smart enough to call Trim when necessary
long givenValueNumber = long.Parse(txtgivenValue.Text);
lblOutput.Text = TheRange(numbers, givenValueNumber);
}
答案 1 :(得分:0)
只需使用:
var belowList = numbers.Where(i => i <= x);
var aboveList = numbers.Where(i => i >= x);
long? upper = belowList.Any() ? belowList.Max() : null;
long? lower = aboveList.Any() ? belowList.Min() : null;
// now you need to handle various scenarios
if( upper.HasValue && lower.HasValue )
{
// both are found and have value
// if (upper == lower) return any
// else return both
}
else if( ! upper.HasValue )
{
// belowList was empty
string result "< " + numbers.Min();
}
else if( ! lower.HasValue )
{
// aboveList was empty
string result "> " + numbers.Max();
}
else
{
// none have value
}