【问题标题】:Specifying Ranges in C#在 C# 中指定范围
【发布时间】:2016-07-26 20:16:46
【问题描述】:

我有 6 个范围:

1000000-5000000
50000001-10000000
10000001-25000000
25000001-50000000
50000001-75000000
75000001-100000000

现在怎么说呢:

var range1 = 1000000-50000000;
var range2 = 50000001-10000000;
int limit = 10000000;

if(limit and range1)
{
     result = 10;
}
else if(limit and range2)
{
     result = 20;
}

所以我的意思是,如果有限制和范围 1 的组合,那么结果是 10?我该怎么做?

【问题讨论】:

  • C# 中没有表示范围的内置数据类型。你必须自己写。
  • 为什么不在 if 语句中使用符号 > 和
  • 当心笑话:if( Enumerable.Range(1,1000).Contains(5) ) ...
  • 我无法理解您的问题,您能否详细说明一下

标签: c#


【解决方案1】:

您可以尝试制作一些小的匿名(或不那么匿名,以供重复使用)功能:

Func<int, bool> range1 = i => (1000000 >= i) && (i <= 50000000);
Func<int, bool> range2 = i => (50000001 >= i) && (i <= 10000000);
Func<int, bool> limit =  i => i <= 10000000;

var test = 2000000;

if(limit(test) && range1(test))
{
     result = 10;
}
else if(limit(test) && range2(test))
{
     result = 20;
}

【讨论】:

    【解决方案2】:

    如果你的范围是连续的,就像你给出的例子一样,那么请注意你不需要任何“间隔”。

    1-9、10-19、20-29 等连续范围实际上定义了一个“阈值点”:9|10、19|20 等等。您可以简单地检查 1-9、10-19、20-29 范围,而不是检查:

    if ( x <= 9 )
       ...
    else if ( x <= 19 )
       ...
    else if ( x <= 29 )
       ...
    

    请注意,else 部分保证了每种情况下的下限。

    编辑:

    你已经用result = 10等更新了你的代码,如果你真的只需要这么简单的操作,那么你可以定义一个列表:

    var levelsAndValues = List<Tuple<int, int>>();
    levelsAndValues.Add(Tuple.Create(5000000, 10));
    levelsAndValues.Add(Tuple.Create(10000000, 20));
    ...
    

    并在其上运行一个简单的循环:

    int limit = 1000000;
    int result = 0;
    foreach(var level in levelsAndValues)
        if(limit > level.Item1)
            result = level.Item2;
        else
            break;
    

    或 linq-lookup:

    var result = levelsAndValues.Where(level => limit > level.Item1)
                                .Select(level => level.Item2)
                                .LastOrDefault();
    

    现在,如果您的范围不连续 - 您只需将第三个值引入元组:{low,high,value} 而不是像我上面写的那样仅 {high,value},然后相应地更新过滤。这可能也是将 Tuple 更改为自定义类型的好时机。

    或者,使用Interval datatype posted here,就像马丁在 cmets 中暗示的那样。

    【讨论】:

      【解决方案3】:

      您可以为此声明类:

      public class Range
      {
          public int Min { get; set; }
          public int Max { get; set; }
          public int Limit { get; set; }
          public int Result{get;set;}
      
          public Range(int min, int max, int limit, int result)
          {
              this.Min = min;
              this.Max = max;
              this.Limit = limit;
              this.Result = result;
          }
      
          public bool InRange(int value)
          {
              if (value >= this.Min && value <= this.Max && value <= limit)
                  return true;
              return false;
          }
      }
      

      并像这样使用这个类:

      List<Range> rangeList = new List<Range>();
              rangeList.Add(new Range(1000000, 5000000, 10000000, 10));
              rangeList.Add(new Range(5000001, 10000000, 10000000, 20));
              int? result = rangeList.Where(t => t.InRange(value)).Select(t => t.Result).FirstOrDefault();
      

      如果变量结果不为空,它就是你的最终结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-11
        • 1970-01-01
        • 2019-08-13
        • 1970-01-01
        • 2013-08-03
        • 2014-07-10
        • 2012-04-04
        • 2016-04-07
        相关资源
        最近更新 更多