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实现,应该怎样改写???????
最后在这个集合中取到最大金额(既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实现,应该怎样改写???????
where vouScore.ChargeMoney <=Convert.ToDouble(textbox.Text)
orderby vouScore.ChargeMoney descending
select vouScore.Score).FirstOrDefalut();
double MaxMoneyScore = query==null?0:query;
var query=(from p in bsIntegrationRule
where p.ChargeMoney<=Convert.ToDouble(textbox.Text.Trim())
select p.ChargeMoney).Max();
当然你也可以用lamda表达式来实现:
var query=bsIntegrationRule.Where(vouScore=>vouScore.ChargeMoney <=Convert.ToDouble(textbox.Text))
.OrderByDescending(vouScore=>vouScore.ChargeMoney)
.Select(vouScore=>vouScore.Score)
.FirstOrDefalut();
现在提示:
错误 10 找不到源类型“System.Windows.Forms.BindingSource”的查询模式的实现。找不到“Where”。请考虑显式指定范围变量“vouScore”的类型。2楼也是这个错
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;
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”,该表达式的结果始终为
where vouScore.ChargeMoney <= Convert.ToDouble(seChargeMoneys.Text)
orderby vouScore.ChargeMoney descending
select vouScore).FirstOrDefault();
double MaxMoneyScore = query == null ? 0 : query.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;
不是 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;