Я считал много сайтов/потоков на выборе и выбираю многих в LINQ, но все еще не вполне понимаю.
Выбор возвращает один элемент в наборе и выбирает, многие сглаживают набор (например, Список> ())?
Спасибо
Вот образец. Надеюсь, он все прояснит:
static void MethodRun()
{
List<Topping> testToppings = new List<Topping> { Topping.Cheese, Topping.Pepperoni, Topping.Sausage };
var firstLetterofToppings = testToppings.Select(top => top.ToString().First());
// returns "C, P, S"
var singleToppingPizzas = testToppings.Select(top => new Pizza(top)).ToArray();
// returns "Pizza(Cheese), Pizza(Pepperoni), Pizza(Sausage)"
List<Topping> firstPizza = new List<Topping> { Topping.Cheese, Topping.Anchovies };
List<Topping> secondPizza = new List<Topping> { Topping.Sausage, Topping.CanadianBacon, Topping.Pepperoni };
List<Topping> thirdPizza = new List<Topping> { Topping.Ham, Topping.Pepperoni };
List<IEnumerable<Topping>> toppingsPurchaseOrder = new List<IEnumerable<Topping>> { firstPizza, secondPizza, thirdPizza };
var toppingsToOrder = toppingsPurchaseOrder.SelectMany(order => order);
//returns "Cheese, Anchovies, Sausage, CanadianBacon, Pepperoni, Ham, Pepperoni"
}
class Pizza
{
public List<Topping> Toppings { get; private set; }
public Pizza(Topping topping) : this(new List<Topping> { topping }) { }
public Pizza(IEnumerable<Topping> toppings)
{
this.Toppings = new List<Topping>();
this.Toppings.AddRange(toppings);
}
}
enum Topping
{
Cheese,
Pepperoni,
Anchovies,
Sausage,
Ham,
CanadianBacon
}
Ключ в том, что Select () может выбирать любой тип объекта. Верно, что вы можете выбрать свойство любого общего значения, присвоенного вашей коллекции, но вы также можете выбрать любой другой тип объекта. SelectMany () просто сглаживает ваш список.
SelectMany возвращает количество объектов для каждого объекта, переданного в выражение. Select istead возвращает единственный объект для каждого объекта, переданного в выражение.
Цитата из документации:
Select Many
Проецирует каждый элемент последовательности в IEnumerable <(Of <(T>)>) и объединяет результирующие последовательности в одну последовательность.
Выбрать
Проецирует каждый элемент эпизода в новую форму.
Вы можете использовать SelectMany
, если хотите сгладить иерархию. Например. если у вас есть Заказы
и OrderDetails
. Если вы хотите сделать выбор на основе заказов, но хотите получить в качестве возврата OrderDetails
, используйте SelectMany
.
var result = db.Orders
.Where(x => x.CustomerId == 500) // input to next expression is IEnumerable<Order>
.SelectMany(x => x.OrderDetails) // input to next expression is IEnumerable<OrderDetails>
.Sum(x => x.PositionTotal);
var result = db.Orders
.Where(x => x.CustomerId == 500) // input to next expression is IEnumerable<Order>
.Select(x => CustomerName);