[c#] الفرق بين حدد و SelectMany



Answers

اختيار العديد يشبه عملية الانضمام عبر في SQL حيث يأخذ المنتج عبر.
على سبيل المثال إذا كان لدينا

Set A={a,b,c}
Set B={x,y}

اختيار العديد يمكن استخدامها للحصول على المجموعة التالية

{ (x,a) , (x,b) , (x,c) , (y,a) , (y,b) , (y,c) }

لاحظ أننا هنا نأخذ جميع التركيبات الممكنة التي يمكن إجراؤها من عناصر المجموعة A و B.

إليك مثال LINQ يمكنك تجربته

  List<string> animals = new List<string>() { "cat", "dog", "donkey" };
  List<int> number = new List<int>() { 10, 20 };

  var mix=number.SelectMany(num => animals, (n, a) => new { n, a });

المزيج سيكون له العناصر التالية في هيكل مسطح مثل

{(10,cat), (10,dog), (10,donkey), (20,cat), (20,dog), (20,donkey)}
Question

لقد كنت أبحث في الفرق بين Select و SelectMany ولكني لم أتمكن من العثور على إجابة مناسبة. أنا بحاجة لمعرفة الفرق عند استخدام LINQ إلى SQL ولكن كل ما وجدته هو أمثلة صفيف قياسية.

يمكن للشخص تقديم مثال على LINQ إلى SQL؟




قد لا تكون بعض SelectMany ضرورية. أقل من 2 الاستعلامات تعطي نفس النتيجة.

Customers.Where(c=>c.Name=="Tom").SelectMany(c=>c.Orders)

Orders.Where(o=>o.Customer.Name=="Tom")

بالنسبة لعلاقة رأس بأطراف ،

  1. إذا كان البدء من "1" ، هناك حاجة إلى SelectMany ، فإنه يسوي الكثير.
  2. إذا كان البدء من "العديد" ، ليست هناك حاجة SelectMany. ( لا يزال من الممكن التصفية من "1" ، وهذا أيضًا أبسط من طلب الانضمام القياسي القياسي)
from o in Orders
join c in Customers on o.CustomerID equals c.ID
where c.Name == "Tom"
select o



فقط للحصول على عرض بديل قد يساعد بعض المبرمجين العمليين هناك:

  • Select map
  • SelectMany هو bind (أو flatMap سكالا / كوتلين)



أنا أفهم SelectMany للعمل مثل اختصار الانضمام.

حتى تتمكن من:

var orders = customers
             .Where(c => c.CustomerName == "Acme")
             .SelectMany(c => c.Orders);



إنها أفضل طريقة لفهم أعتقد.

            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();

مثال جدول الضرب.




SelectMany() إمكانية طي تسلسل متعدد الأبعاد بطريقة تتطلب خلافًا آخر Select() أو تكرارًا.

مزيد من التفاصيل في هذا بلوق وظيفة .




Related