Выберите и выберите многих различие

Я считал много сайтов/потоков на выборе и выбираю многих в LINQ, но все еще не вполне понимаю.

Выбор возвращает один элемент в наборе и выбирает, многие сглаживают набор (например, Список> ())?

Спасибо

7
задан GurdeepS 11 March 2010 в 14:13
поделиться

2 ответа

Вот образец. Надеюсь, он все прояснит:

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 () просто сглаживает ваш список.

5
ответ дан 7 December 2019 в 05:21
поделиться

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);
3
ответ дан 7 December 2019 в 05:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: