使用LINQ在列表中过滤列表

时间:2018-12-05 22:44:30

标签: c# linq

我有以下课程:

class Order
{
    public string AccountNumber;
    public string AccountName;
    public List<OrderLine> OrderLines = new List<OrderLine>();
    public DateTime StartDate;
    public DateTime EndDate;       
}

class OrderLine
{
     public string Description;
     public string ProductCode;
     public double Duration;
     public int Quantity;
}

根据以下条件来获取Order对象列表的LINQ代码是什么?

  1. [订单]帐号等于“ 1234”
  2. [OrderLine]数量大于10

2 个答案:

答案 0 :(得分:2)

假设您希望所有记录都符合这两个条件(对于任何令人满意的OrderLine,否则请更改为All()):

public static void IEnumerable<Order> GetQualifying(this IEnumerable<Order> orders, string accountNo, int minQty) {
    return orders.Where(o =>
        o.AccountNumber == accountNo
        && o.OrderLines.Any(ol => ol.Quantity >= minQty);
}

请注意不要出现一个错误的错误,因为我已经从字面上解释了“最小数量”。

此外,this语法非常适合编写extension methods,使您可以像这样调用:

Order[] orders = //stuff;
Order[] qualifiedOrders = orders.GetQualifying("1234", 9).ToArray();

请注意,我建议您在无法再从lazy evaluation中受益时立即使用ToArray(),否则,请对原始IEnumerable<> will cause reevaluation进行后续操作(阅读:列举再次收集。)

答案 1 :(得分:0)

您可以选择:

list.Where(x => x.AccountNumber == "12345" && x.OrderLines.Any(o => o.Quantity > 10));

或:

list.Where(x => x.AccountNumber == "12345" && x.OrderLines.All(o => o.Quantity > 10));

取决于您是否要检索AccountNumber12345且所有OrderLine数量大于10的所有对象,或者是否全部 OrderLine数量大于10