简体   繁体   English

如何从范围中获得最低和最高数字

[英]How to get lowest and highest number from range

I have numbers list like this: {100, 150, 200, 250, 300, 350, 400, 450}我有这样的数字列表: {100, 150, 200, 250, 300, 350, 400, 450}

How to find lowest and highest number in between by given number ?如何通过给定数字找到介于两者之间的最低最高数字

Examples:例子:

  • If x = 90 and desired output is 100 .如果x = 90并且所需的输出是100
  • if x = 120 then desired output is 100, 150如果x = 120那么期望的输出是100, 150
  • If x = 150 then desired output is 150如果x = 150那么期望的输出是150
  • If x = 151 then desired output is 150, 200如果x = 151那么期望的输出是150, 200
  • If x = 420 then desired output is 400, 450如果x = 420那么期望的输出是400, 450
  • If x = 450 then desired output is 450如果x = 450那么期望的输出是450
  • If x = 451 then desired output is > 450如果x = 451那么期望的输出是> 450

Code:代码:

I have tried with windows app ( C# ), but results are not accurate.我曾尝试使用 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();
  }

Please, note that Max() / Min() on empty cursor throws exception :请注意,游标上的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();

This fact, probably, is the main difficuly in your case;这个事实可能是您案例中的主要问题; however, one simple foreach loop is enough.然而,一个简单的foreach循环就足够了。 The only (small) difficulty is to return the result in the right format for all possible cases:唯一的(小)困难是为所有可能的情况以正确的格式返回结果:

// 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}";
}

Let's have a look:我们来看一下:

  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);

Outcome:结果:

 90 :: < 100
120 :: 100, 150
150 :: 150
151 :: 150, 200
420 :: 400, 450
450 :: 450
451 :: > 450

Finally, GetRangeList() can be implemented as follows最后, 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); 
}

Just use:只需使用:

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
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM