【问题标题】:Linq - getting a value that is between a lower limit and upper limitLinq - 获取介于下限和上限之间的值
【发布时间】:2012-01-26 11:57:56
【问题描述】:

我有一个费用列表(linq 到 sql 实体 - 如果相关) - 费用上限、费用下限(均为十进制值)。我正在传递一个 property value - 比如说 90000,我想检查这个 propertybest 是否匹配 one(或 first 值很多)从费用清单中。

费用可能是……

(较低的费用 - 较高的费用)

0 - 50000
50001 - 75000
75001 - 90000
90001 - 140000
190000 - 500000

在这些值中,90000 最适合 75001 - 90000 波段,所以我想提取那个 FeeDetail 实体。我真的不知道要使用什么运算符,感谢任何帮助,到目前为止我的代码是......

    [Test]
    public void GetFeeRange()
   {
        const int id = 44;
        var propValue = 90000;

        //get a specific fee entity, then get the range of fee details...
        var recommendedFees = RepoSession.All<Fee>()
            .Where(x =>
                   x.ClientSurveyTypeID == id)
            .GroupJoin(_readOnlySession.All<FeeDetail>(),
                       x => x.FeeID,
                       y => y.FeeID,
                       (x, y) => new
                                     {
                                         FeeDetail = y.DefaultIfEmpty()
                                     })
            .Select(x => x.FeeDetail)
            .SingleOrDefault();

        Assert.IsNotNull(recommendedFees);

       //order fees by lowest fee - *the bit I am stuck on*
        var bestMatch = recommendedFees.OrderBy(x => x.Lower)
            .TakeWhile(x => propValue >= x.Lower || propValue <= x.Upper)
            .FirstOrDefault();



    }

问题 - 我将如何执行范围检查?我需要什么 linq 运算符?不确定我是否应该执行一段时间,从该范围内获得最好的费用?

注意:费用很容易...

(较低的费用 - 较高的费用)

0 - 50000
50001 - 75000
95001 - 140000
190000 - 500000

如果找到最佳匹配,则将其拉出获取最接近的匹配...如果一个不是(足够接近)完全匹配,我可以显示可用匹配的列表

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    一个简单的.Where 应该没问题:

    var bestMatch = recommendedFees
                  .Where(x => propValue >= x.Lower && propValue <= x.Upper)
                  .OrderBy(x => x.Lower)                  
                  .FirstOrDefault();
    

    【讨论】:

    • +1,但 OR 运算符应替换为 AND。 .Where(x =&gt; propValue &gt;= x.Lower &amp;&amp; propValue &lt;= x.Upper)
    • @PaulSasik 是的,在我发布并更改它之后发现了这一点。谢谢。
    【解决方案2】:

    比如...

    recommendedFees.Where(x => x.upperFee >= theFee).OrderByDescending(x => x.upperFee).Take(1).FirstOrDefault();
    

    【讨论】:

    • Take(1) 部分是多余的,因为延迟执行 LINQ 查询。
    • 需要看一下,就像前段时间使用 First/FirstOrDefault 时一样,我遇到了“序列包含多个元素”的异常,因此使用 Take(1) 有点习惯
    • 当在具有多个元素的IEnumerable&lt;T&gt; 上使用SingleSingleOrDefault 时会发生该异常; afaik FirstOrDefault 方法从不抛出任何东西,除非它的 sourcenull
    • 我喜欢这种方法,因为通常滑动刻度只存储一个边界,例如下边界。上限是隐含的。这适合该用例。
    【解决方案3】:
    var myfee = 90000;
    var myFoundFeeRange = (from feeRange in feeRanges 
              where feeRange.lowerfee <= myfee && myfee <= feeRange.upperfee 
              select feeRange ).First()
    

    这将简单检查费用是否在边界内。并返回匹配的边界

    【讨论】:

    • 您必须检查 &lt;= 而不是 &lt; 否则 OP 的示例将不匹配任何内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多