bsIntegrationRule为BidingSource控件,DataSource绑定的实体类VouchCRB_ScoreInfo,该实体类有两个属性 ChargeMoney和Score,ChargeMoney表示金额,Score表示积分,都为double类型。   说一下要实现的功能,界面上一个textbox,用于输入金额数值。然后根据这个金额,取bsIntegrationRule中低于textbox的所有行(既bsIntegrationRule某行的ChargeMoney属性低于textBox中的值)的集合。
   最后在这个集合中取到最大金额(既ChargeMoney的值)对应的积分。   我的写法如下:
   
//第一步:取出bsIntegrationRule中低于textbox.Text的数组,数组名称为LowMoneyList
                IList LowMoneyList = new ArrayList();
                for (int k = 0; k < bsIntegrationRule.Count; k++)//得到低于当前充值金额的数组
                {
                    VouchCRB_ScoreInfo vouScore = bsIntegrationRule[k] as VouchCRB_ScoreInfo;
                    if (Convert.ToDouble(textbox.Text) >= vouScore.ChargeMoney)//当前充值金额>=规则中的金额
                    {
                        LowMoneyList.Add(vouScore);
                    }
                }                //第二步:取出LowMoneyList中金额最大的对应的积分
                if (LowMoneyList.Count < 1)
                {
                    return 0;
                }
                else
                {
                    int discountRateIndex = 0;//当前索引
                    double curMoney = 0; //当前金额
                    //得到数组中金额最大的积分
                    for (int l = 0; l < LowMoneyList.Count; l++)
                    {
                        VouchCRB_ScoreInfo vouDiscount = LowMoneyList[l] as VouchCRB_ScoreInfo;
                        if (vouDiscount.ChargeMoney >= curMoney)
                        {
                            discountRateIndex = l;//索引赋值
                            curMoney = vouDiscount.ChargeMoney;//当前最大金额
                        }
                    }                    double MaxMoneyScore = (LowMoneyList[discountRateIndex] as VouchCRB_ScoreInfo).Score;//得到生成的最大金额中的积分
                    return MaxMoneyScore;//MaxMoneyScore即为我想要的积分
                }     现需把这个功能用linq实现,应该怎样改写???????

解决方案 »

  1.   

    var query=(from vouScore in bsIntegrationRule
              where vouScore.ChargeMoney <=Convert.ToDouble(textbox.Text)
              orderby vouScore.ChargeMoney descending
              select vouScore.Score).FirstOrDefalut();
    double MaxMoneyScore = query==null?0:query;
      

  2.   


    var query=(from p in  bsIntegrationRule
              where p.ChargeMoney<=Convert.ToDouble(textbox.Text.Trim())  
              select p.ChargeMoney).Max();
      

  3.   

    这就看出了LINQ 的优雅之处,简单的代码,清晰的思路。
    当然你也可以用lamda表达式来实现:
    var query=bsIntegrationRule.Where(vouScore=>vouScore.ChargeMoney <=Convert.ToDouble(textbox.Text))
                               .OrderByDescending(vouScore=>vouScore.ChargeMoney)
                               .Select(vouScore=>vouScore.Score)
                               .FirstOrDefalut();
      

  4.   

    是不是要将bsIntegrationRule先转换一下?
    现在提示:
    错误 10 找不到源类型“System.Windows.Forms.BindingSource”的查询模式的实现。找不到“Where”。请考虑显式指定范围变量“vouScore”的类型。2楼也是这个错
      

  5.   


    var query=(from vouScore in (bsIntegrationRule as List<VouchCRB_ScoreInfo>)
              where vouScore.ChargeMoney <=Convert.ToDouble(textbox.Text)
              orderby vouScore.ChargeMoney descending
              select vouScore.Score).FirstOrDefalut();
    double MaxMoneyScore = query==null?0:query;
      

  6.   

    你转换一下bsIntegrationRule 是VouchCRB_ScoreInfo数组,bsIntegrationRule.ToList()试试
      

  7.   

    改成这样就不报错了 但是有个警告    var query = (from vouScore in (bsIntegrationRule.DataSource as List<VouchCRB_ScoreInfo>)
                                 where vouScore.ChargeMoney <= Convert.ToDouble(seChargeMoneys.Text)
                                 orderby vouScore.ChargeMoney descending
                                 select vouScore.Score).FirstOrDefault();
                    double MaxMoneyScore = query == null ? 0 : query;警告: query == null 
    由于“double”类型的值永不等于“double?”类型的“null”,该表达式的结果始终为
      

  8.   

    var query = (from vouScore in (bsIntegrationRule.DataSource as List<VouchCRB_ScoreInfo>)
                                 where vouScore.ChargeMoney <= Convert.ToDouble(seChargeMoneys.Text)
                                 orderby vouScore.ChargeMoney descending
                                 select vouScore).FirstOrDefault();
                    double MaxMoneyScore = query == null ? 0 : query.Score;这样就应该没警告了
      

  9.   

    这里的 query == null 是不是就相当于我之前写的那句if (LowMoneyList.Count < 1)这种情况?
      

  10.   

    这样报错了。错误 35 “double”不包含“Score”的定义,并且找不到可接受类型为“double”的第一个参数的扩展方法“Score”(是否缺少 using 指令或程序集引用?
      

  11.   


    你是不是说要改成这样?
                   var query = (from vouScore in (bsIntegrationRule.DataSource as List<VouchCRB_ScoreInfo>)
                                 where vouScore.ChargeMoney <= Convert.ToDouble(seChargeMoneys.Text)
                                 orderby vouScore.ChargeMoney descending
                                 select vouScore).FirstOrDefault();
                    double MaxMoneyScore = query == null ? 0 : query.Score;
      

  12.   

    看仔细代码: select vouScore
    不是 select vouScore.Score
    var query = (from vouScore in (bsIntegrationRule.DataSource as List<VouchCRB_ScoreInfo>)
                                 where vouScore.ChargeMoney <= Convert.ToDouble(seChargeMoneys.Text)
                                 orderby vouScore.ChargeMoney descending
                                 select vouScore).FirstOrDefault();
                    double MaxMoneyScore = query == null ? 0 : query.Score;
      

  13.   

    感谢帮助,这算是我linq的启程吧。