Wozu brauche ich eigentlich die SelectMany() Linq Methode? Das hat sich sicherlich schon jeder einmal gefragt. Ich habe möchte an einem kurzen Beispiel zeigen, wozu das gut sein kann.
Wie immer starte ich mit einer Consolen Anwendung. Die Program.cs sieht wie folgendermaßen aus:
public class Order
{
public int OrderId { get; set; }
public List
}
public class OrderItem
{
public double Quantity { get; set; }
public decimal Price { get; set; }
public string Name { get; set; } = string.Empty;
}
Ich definiere zwei Typen: Order und OrderItems.
Dann erstelle drei Order und stecke diese in eine Liste:
ar o = new Order
{
OrderId = 1, OrderItems =
[
new OrderItem { Name = „Item 1“, Price = 10, Quantity = 1 },
new OrderItem { Name = „Item 2“, Price = 20, Quantity = 2 },
new OrderItem { Name = „Item 3“, Price = 30, Quantity = 3 }
]
};
var o2 = new Order
{
OrderId = 2,
OrderItems =
[
new OrderItem { Name = „Item 1“, Price = 40, Quantity = 5 },
new OrderItem { Name = „Item 2“, Price = 60, Quantity = 6 },
]
};
var o3 = new Order
{
OrderId = 2,
};
var orders = new List
Ich möchte gerne alle OrderItems ermitteln. Wie kann ich das erreichen?
Eine Möglichkeit wäre:
List
//wie können wir eine liste aller orderitems erstellen?
foreach (var order in orders)
{
//wollen keine zweite loop, deshalb addRange
allOrderItems.AddRange(order.OrderItems ?? Enumerable.Empty
}
Das ist nicht so eine elegante Lösung, da wir AddRange benutzen, um eine zweite Schleife zu umgehen.
Die bessere Variante ist eben mit SelectMany(). Das sieht dann so aus:
allOrderItems = orders.SelectMany(b => b.OrderItems ?? Enumerable.Empty
Diese Variante aggregiert alle OrderItems in eine Liste und das mit einem Einzeiler.
So sieht der ganze Code aus:
var o = new Order
{
OrderId = 1, OrderItems =
[
new OrderItem { Name = „Item 1“, Price = 10, Quantity = 1 },
new OrderItem { Name = „Item 2“, Price = 20, Quantity = 2 },
new OrderItem { Name = „Item 3“, Price = 30, Quantity = 3 }
]
};
var o2 = new Order
{
OrderId = 2,
OrderItems =
[
new OrderItem { Name = „Item 1“, Price = 40, Quantity = 5 },
new OrderItem { Name = „Item 2“, Price = 60, Quantity = 6 },
]
};
var o3 = new Order
{
OrderId = 2,
};
var orders = new List
List
//wie können wir eine liste aller orderitems erstellen?
foreach (var order in orders)
{
//wollen keine zweite loop, deshalb addRange
allOrderItems.AddRange(order.OrderItems ?? Enumerable.Empty
}
allOrderItems = orders.SelectMany(b => b.OrderItems ?? Enumerable.Empty
Console.ReadLine();
public class Order
{
public int OrderId { get; set; }
public List
}
public class OrderItem
{
public double Quantity { get; set; }
public decimal Price { get; set; }
public string Name { get; set; } = string.Empty;
}