使用lambda表达式查找列表中的项目

时间:2016-12-02 10:03:18

标签: c# linq lambda

我有以下课程:

public class AuthenticateCustomerResponse
{
    public EligiblePromotions EligiblePromotions { get; set; }
}

public class EligiblePromotions
{
    public List<PromotionList> PromotionList { get; set; }
}
public class PromotionList
{
    public string LineOfBusiness { get; set; }
    public AuthenticatePromotions Promotions { get; set; }
}
public class AuthenticatePromotions
{
    public List<AuthenticatePromotion> Promotion { get; set; }
}
public class AuthenticatePromotion
{
    public string ServiceType { get; set; }
}

我想要检索PromotionList等于“VID”且LineOfBusiness等于“SAT”的ServiceType。 我试过跟随lambda表达式:

PromotionList getPromotion = AuthenticateCustomerResponse.EligiblePromotions.PromotionList.Find(p => p.LineOfBusiness.ToUpper().Equals("VID")).Promotions.Promotion.Find(o=>o.ServiceType.Equals("SAT"));

但是我收到了错误:

  

无法将类型'AuthenticatePromotion'隐式转换为   'PromotionList'

我做错了什么?

2 个答案:

答案 0 :(得分:2)

下面的代码将为您提供LineOfBusiness等于'VID'的第一个对象。

var promotionList = AuthenticateCustomerResponse.EligiblePromotions.PromotionList
.Where(p => p.LineOfBusiness.ToUpper().Equals("VID")).FirstOrDefault();

如果您希望VID为.ToList()的所有对象代替LineOfBusiness

,则可以使用.FirstOrDefault()

编辑:如果要查看SAT,可以在.Where()添加另一个子句

答案 1 :(得分:0)

这部分代码

.Promotion.Find(o=>o.ServiceType.Equals("SAT"));

返回AuthenticatePromotion,但您明确要求PromotionList对象。

摆脱错误的一种方法是使用隐式变量关键字var

var getPromotion = AuthenticateCustomerResponse.EligiblePromotions.PromotionList.Find(p => p.LineOfBusiness.ToUpper().Equals("VID")).Promotions.Promotion.Find(o=>o.ServiceType.Equals("SAT"));

但是,这当然会返回AuthenticatePromotion