【问题标题】:FIND items in list using lambda expression使用 lambda 表达式查找列表中的项目
【发布时间】:2016-12-02 10:03:18
【问题描述】:

我有以下课程:

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; }
}

我想检索PromotionListLineOfBusiness 等于“VID”并且ServiceType 等于“SAT”。 我尝试了以下 lambda 表达式:

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

但我遇到了错误:

无法将类型“AuthenticatePromotion”隐式转换为 '促销清单'

我做错了什么?

【问题讨论】:

  • 你的属性和类名的命名很糟糕。使用 FirstOrDefault 或在哪里会更容易。
  • @Silvermind Post 已编辑
  • 您正在从您的Promotion 列表中检索AuthenticatePromotion 对象。如果你只想要PromotionList,为什么还要另一个Find

标签: c# linq lambda


【解决方案1】:

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

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

如果您想要所有 VID 为 LineOfBusiness 而不是 .FirstOrDefault() 的对象,您可以使用 .ToList()

编辑:如果您想检查 SAT,可以在 .Where() 中添加另一个子句

【讨论】:

  • 无法将类型“System.Collections.Generic.List”隐式转换为“PromotionList”
  • ToList 返回通过 Where 子句的对象列表。如果您只想要一个对象,请从列表中选择一个或使用 FirstOrDefault
  • 只是一个提示:我会重新考虑你实现类的方式。创建对仅包含列表的类的引用没有多大意义。你可以让你的生活更轻松,并将列表移动到 PromotionList
【解决方案2】:

这部分代码

.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

【讨论】:

  • 也许我的查询是错误的。您认为检索PromotionListLineOfBusiness 等于“VID”且ServiceType 等于“SAT”的查询是否正确?
  • @zariakhan 我认为这可能取决于您的应用程序的其余部分,尽管我必须说这么长的一行我会建议将整个查询放入一个具有合理名称的方法中以提高可读性跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多