1361 Stimmen

Unterschied zwischen Select und SelectMany

Ich habe nach dem Unterschied zwischen Select y SelectMany aber ich habe keine passende Antwort gefunden. Ich muss den Unterschied bei der Verwendung von LINQ To SQL lernen, aber alles, was ich gefunden habe, sind Standard-Array-Beispiele.

Kann jemand ein LINQ To SQL-Beispiel zur Verfügung stellen?

9 Stimmen

Sie können sich den Code für SelectMany mit einer Funktion oder mit zwei Funktionen ansehen referencesource.microsoft.com/#System.Core/System/Linq/

1 Stimmen

Wenn Sie mit Kotlin vertraut sind, hat es ganz ähnliche Implementierungen für Sammlungen wie map aka C# Select und flatMap aka C# SelectMany. Grundsätzlich Kotlin std Bibliothek Erweiterung Funktionen für Sammlungen hat Ähnlichkeit mit C # Linq Bibliothek.

0 Stimmen

Würde man zustimmen, dass SelectFromMany wäre ein viel beschreibenderer Name als SelectMany ?

2voto

KEMBL Punkte 400

Ein weiteres Beispiel, wie SelectMany + Select verwendet werden kann, um Daten von Sub-Array-Objekten zu akkumulieren.

Angenommen, wir haben Benutzer mit ihren Telefonen:

class Phone { 
    public string BasePart = "555-xxx-xxx"; 
}

class User { 
    public string Name = "Xxxxx";
    public List<Phone> Phones; 
}

Jetzt müssen wir die BaseParts aller Telefone aller Benutzer auswählen:

var usersArray = new List<User>(); // array of arrays
List<string> allBaseParts = usersArray.SelectMany(ua => ua.Phones).Select(p => p.BasePart).ToList();

0 Stimmen

Was ist Ihrer Meinung nach besser? Deins oder usersArray.SelectMany(ua => ua.Phones.Select(p => p.BasePart))

0voto

Sharunas Bielskis Punkte 955

Hier ist ein Codebeispiel mit einer initialisierten kleinen Sammlung zum Testen:

class Program
{
    static void Main(string[] args)
    {
        List<Order> orders = new List<Order>
        {
            new Order
            {
                OrderID = "orderID1",
                OrderLines = new List<OrderLine>
                {
                    new OrderLine
                    {
                        ProductSKU = "SKU1",
                        Quantity = 1
                    },
                    new OrderLine
                    {
                        ProductSKU = "SKU2",
                        Quantity = 2
                    },
                    new OrderLine
                    {
                        ProductSKU = "SKU3",
                        Quantity = 3
                    }
                }
            },
            new Order
            {
                OrderID = "orderID2",
                OrderLines = new List<OrderLine>
                {
                    new OrderLine
                    {
                        ProductSKU = "SKU4",
                        Quantity = 4
                    },
                    new OrderLine
                    {
                        ProductSKU = "SKU5",
                        Quantity = 5
                    }
                }
            }
        };

        //required result is the list of all SKUs in orders
        List<string> allSKUs = new List<string>();

        //With Select case 2 foreach loops are required
        var flattenedOrdersLinesSelectCase = orders.Select(o => o.OrderLines);
        foreach (var flattenedOrderLine in flattenedOrdersLinesSelectCase)
        {
            foreach (OrderLine orderLine in flattenedOrderLine)
            {
                allSKUs.Add(orderLine.ProductSKU);
            }
        }

        //With SelectMany case only one foreach loop is required
        allSKUs = new List<string>();
        var flattenedOrdersLinesSelectManyCase = orders.SelectMany(o => o.OrderLines);
        foreach (var flattenedOrderLine in flattenedOrdersLinesSelectManyCase)
        {
            allSKUs.Add(flattenedOrderLine.ProductSKU);
        }

       //If the required result is flattened list which has OrderID, ProductSKU and Quantity,
       //SelectMany with selector is very helpful to get the required result
       //and allows avoiding own For loops what according to my experience do code faster when
       // hundreds of thousands of data rows must be operated
        List<OrderLineForReport> ordersLinesForReport = (List<OrderLineForReport>)orders.SelectMany(o => o.OrderLines,
            (o, ol) => new OrderLineForReport
            {
                OrderID = o.OrderID,
                ProductSKU = ol.ProductSKU,
                Quantity = ol.Quantity
            }).ToList();
    }
}
class Order
{
    public string OrderID { get; set; }
    public List<OrderLine> OrderLines { get; set; }
}
class OrderLine
{
    public string ProductSKU { get; set; }
    public int Quantity { get; set; }
}
class OrderLineForReport
{
    public string OrderID { get; set; }
    public string ProductSKU { get; set; }
    public int Quantity { get; set; }
}

-3voto

user5966157 Punkte 17

Das ist der beste Weg, um zu verstehen, denke ich.

            var query =
            Enumerable
                .Range(1, 10)
                .SelectMany(ints => Enumerable.Range(1, 10), (a, b) => $"{a} * {b} = {a * b}")
                .ToArray();

        Console.WriteLine(string.Join(Environment.NewLine, query));

        Console.Read();

Beispiel für die Multiplikationstabelle.

4 Stimmen

Nur wenn sich die Bedeutung von "am besten" dramatisch verändert hat.

2 Stimmen

Das ist also die beste Art zu denken? Was ist dann die schwierige Art zu denken?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X