LINQ:在集合中搜索单个对象的集合

mus*_*fan 6 c# linq

我正在寻找一个简单的LINQ查询,它可以获取集合集合中的项目.考虑以下模型......

class Customer
{
   List<Order> Orders;
   int ID;
}

class Order
{
   int ID;
}
Run Code Online (Sandbox Code Playgroud)

可以说我有一个类型客户列表...

List<Customer> Customers;
Run Code Online (Sandbox Code Playgroud)

我想要的是基于订单 ID的单个订单(这是我已知的输入数据).我也可以假设订单对于客户来说是唯一的(因此只有一个订单具有我在所有客户中寻找的ID)

有没有一个很好的LINQ查询,我可以使用它来获取我正在寻找的订单?

我知道我可以轻松地在一个Orders列表中执行此操作,但这是我必须使用的设置.我不想查询更多数据,如果我已经有足够的内存来获得我需要的东西了.

我可以用半凌乱的for循环来做到这一点.也许我应该这样做?也许我试图过多地简化代码?

Jon*_*eet 14

哎呀,误读了这个问题:

var matchingOrders = from customer in customers
                     from order in customer.Orders
                     where order.ID == orderID
                     select order;

var order = matchingOrders.Single();
Run Code Online (Sandbox Code Playgroud)

与此答案的早期版本一样,请注意,如果没有此类匹配或多个匹配,则此操作将失败.你也可以看看SingleOrDefault,FirstFirstOrDefault.

此代码也可以写成不使用查询表达式SelectMany:

var order = customers.SelectMany(customer => customer.Orders)
                     .Single(order => order.ID == orderID);
Run Code Online (Sandbox Code Playgroud)

请注意,您没有需要使用Where,然后Single-有一个Single过载采取谓词(且同样FirstOrDefault等等).您是否使用查询表达式由您决定 - 我通常使用查询表达式而不是SelectMany,但在这种情况下您不需要客户,因此您可以使用简单的重载SelectMany.