مشاركة عبر


ترتيب بها في PLINQ

في PLINQ، والهدف هو لزيادة الأداء مع المحافظة على صحتها. يجب أن يتم تشغيل استعلام كـ fكـt كـ ممكن ولكن لا يزال الحصول على نتائج الصحيحة. في بعض الحالات، يتطلب يتعلق بترتيب تسلسل مصدر إلى يتم الاحتفاظ به؛ ومع ذلك، طلب يمكن أن تكون كلفة الممكن. ولذلك، بواسطة الافتراضي، PLINQ لا يحافظ على ترتيب التسلسل المصدر. في ترتيب هو النظر، PLINQ لما مكون LINQ to SQL، ولكن هو عكس LINQ إلى الكائنات، الذي المحافظة على الترتيب.

إلى تجاوز سلوك الافتراضي، يمكنك تشغيل بها بترتيب باستخدام AsOrdered()operaإلىr على تسلسل المصدر. يمكنك ثم إيقاف تشغيل ميزة الاحتفاظ بترتيب الأحرف لاحقاً في الاستعلام باستخدام AsUnOrdered()أسلوب.

يظهر المثال التالي استعلام متوازي غير مرتبة لالجميع العناصر التي تطابق شرط، دون محاولة لتصفية إلى ترتيب نتائج بأي طريقة.

Dim cityQuery = From city In cities.AsParallel()
               Where City.Population > 10000
               Take (1000)
var cityQuery = (from city in cities.AsParallel()
                 where city.Population > 10000
                 select city)
                   .Take(1000);

لا ينتج هذا الاستعلام بالضرورة أول المدن 1000 في المصدر التسلسل meet هذا الشرط، ولكن بدلاً من بعض التعيين المدن 1000 التي تحقق الشرط. استعلام PLINQ تقسيم عوامل تشغيل التسلسل المصدر في subsequences المتعددة التي تتم معالجتها كـ tكـks المتزامنة. إذا طلب بها هو لم يكن محدداً، نتائج من كل قسم يتم تسليمها الخروج إلى مرحلة التالية من الاستعلام بترتيب عشوائي. أيضا، قد على قسم العائد مجموعة فرعية نتائجه قبل ذلك بمتابعة إلى معالجة العناصر المتبقية. قد تختلف ترتيب الناتج كل الوقت. يتعذر تشغيل تطبيق الخاص بك التحكم هذا لأن ذلك يعتمد تشغيل كيفية قيام النظام التشغيل بجدولة عمليات جزئية.

يلي مثال تجاوز سلوك الافتراضي باستخدام AsOrdered()العامل تشغيل تسلسل المصدر. ويضمن ذلك Takeالأسلوب بإرجاع اﻷول 10 مدن في تسلسل المصدر التي تحقق الشرط.

Dim orderedCities = From city In cities.AsParallel().AsOrdered()
                    Where City.Population > 10000
                    Take (1000)
            var orderedCities = (from city in cities.AsParallel().AsOrdered()
                                 where city.Population > 10000
                                 select city)
                                .Take(1000);

ومع ذلك، th هو الاستعلام قد لا يعمل سرعة كالإصدار غير مرتبة لأن فإنه يجب أن مقطع صوتي الطلب الأصلي في الأقسام وفي وقت دمج ضمان ترتيب هو consهوtent. ولذلك، فمن الأفضل أن تستخدم AsOrdered()فقط عند ذلك هو المطلوبة، وفقط لتلك الأجزاء من الاستعلام التي تتطلب it. عند طلب بها هو لم يعد مطلوباً، استخدم AsUnordered()لتشغيل إيقاف. المثال التالي يحقق هذا بواسطة إنشاء استعلامات الثاني.

        Dim orderedCities2 = From city In cities.AsParallel().AsOrdered()
                             Where city.Population > 10000
                             Select city
                             Take (1000)

        Dim finalResult = From city In orderedCities2.AsUnordered()
                            Join p In people.AsParallel() On city.Name Equals p.CityName
                            Select New With {.Name = city.Name, .Pop = city.Population, .Mayor = city.Mayor}

        For Each city In finalResult
            Console.WriteLine(city.Name & ":" & city.Pop & ":" & city.Mayor)
        Next

var orderedCities2 = (from city in cities.AsParallel().AsOrdered()
                      where city.Population > 10000
                      select city)
                        .Take(1000);


var finalResult = from city in orderedCities2.AsUnordered()
                  join p in people.AsParallel() on city.Name equals p.CityName into details
                  from c in details
                  select new { Name = city.Name, Pop = city.Population, Mayor = c.Mayor };

foreach (var city in finalResult) { /*...*/ }

لاحظ أن يحتفظ PLINQ ترتيب تسلسل إنتاجها بواسطة عوامل imposing بالترتيب للباقي استعلام. operaإلىrs بمعنى آخر، مثل OrderBy()و ThenBy()تعامل كما لو أنها كانت متبوعة باستدعاء إلى AsOrdered().

العوامل استعلام وطلب

تقديم عوامل الاستعلام التالية بها ترتيب في الجميع العمليات اللاحقة في استعلام، أو حتى AsUnordered()هو تسمى:

  • OrderBy()

  • OrderByDescending()

  • ThenBy()

  • ThenByDescending()

PLINQ التالية استعلام عوامل قد في بعض الحالات تسلسلات مصدر مرتبة لإعطاء نتائج صحيحة يتطلب:

  • Reverse()

  • SequenceEquals()

  • TakeWhile()

  • SkipWhile()

  • Zip()

بعض عوامل الاستعلام PLINQ سلوكها، استناداً إلى ما إذا كان ترتيب تسلسل المصدر الخاص به أو تجمع غير مرتب. يسرد الجدول التالي عوامل تشغيل هذه.

العامل

النتيجة عند تسلسل مصدر هو المرتب

النتيجة عند تسلسل مصدر هو غير مرتبة

Aggregate()

إخراج nondeterministic لعمليات nonassociative أو noncommutative

إخراج nondeterministic لعمليات nonassociative أو noncommutative

All()

غير قابلة للتطبيق

غير قابلة للتطبيق

Any()

غير قابلة للتطبيق

غير قابلة للتطبيق

AsEnumerable()

غير قابلة للتطبيق

غير قابلة للتطبيق

Average()

إخراج nondeterministic لعمليات nonassociative أو noncommutative

إخراج nondeterministic لعمليات nonassociative أو noncommutative

Cast()

نتائج المرتبة

نتائج غير مرتبة

Concat()

نتائج المرتبة

نتائج غير مرتبة

Count()

غير قابلة للتطبيق

غير قابلة للتطبيق

DefaultIfEmpty()

غير قابلة للتطبيق

غير قابلة للتطبيق

Distinct()

نتائج المرتبة

نتائج غير مرتبة

ElementAt()

إرجاع العنصر المحدد

عنصر عشوائي

ElementAtOrDefault()

إرجاع العنصر المحدد

عنصر عشوائي

Except()

نتائج غير مرتبة

نتائج غير مرتبة

First()

إرجاع العنصر المحدد

عنصر عشوائي

FirstOrDefault()

إرجاع العنصر المحدد

عنصر عشوائي

ForAll()

تنفيذ nondeterministically في متوازى

تنفيذ nondeterministically في متوازى

GroupBy()

نتائج المرتبة

نتائج غير مرتبة

GroupJoin()

نتائج المرتبة

نتائج غير مرتبة

Intersect()

نتائج المرتبة

نتائج غير مرتبة

Join()

نتائج المرتبة

نتائج غير مرتبة

Last()

إرجاع العنصر المحدد

عنصر عشوائي

LastOrDefault()

إرجاع العنصر المحدد

عنصر عشوائي

LongCount()

غير قابلة للتطبيق

غير قابلة للتطبيق

Min()

غير قابلة للتطبيق

غير قابلة للتطبيق

OrderBy()

reorders التسلسل

بدء تشغيل جديد مرتبة مقطع

OrderByDescending()

reorders التسلسل

بدء تشغيل جديد مرتبة مقطع

Range()

غير قابل للتطبيق (نفس الافتراضية كـ AsParallel)

غير قابلة للتطبيق

Repeat()

غير قابل للتطبيق (نفس الافتراضية كـ AsParallel)

غير قابلة للتطبيق

Reverse()

عكس

هل لا شيء

Select()

نتائج المرتبة

نتائج غير مرتبة

Select()(مفهرس)

نتائج المرتبة

نتائج غير مرتبة.

SelectMany()

نتائج مرتبة.

نتائج غير مرتبة

SelectMany()(مفهرس)

نتائج مرتبة.

نتائج غير مرتبة.

SequenceEqual()

مقارنة المرتبة

المقارنة غير مرتبة

Single()

غير قابلة للتطبيق

غير قابلة للتطبيق

SingleorDefault()

غير قابلة للتطبيق

غير قابلة للتطبيق

Skip()

تخطي عناصر n أول

تخطي أية عناصر n

SkipWhile()

نتائج مرتبة.

nondeterministic. ينفذ SkipWhile تشغيل ترتيب عشوائي الحالي

Sum()

إخراج nondeterministic لعمليات nonassociative أو noncommutative

إخراج nondeterministic لعمليات nonassociative أو noncommutative

Take()

تأخذ أول nعناصر

تأخذ أي nعناصر

TakeWhile()

نتائج المرتبة

nondeterministic. ينفذ TakeWhile تشغيل ترتيب عشوائي الحالي

ThenBy()

إضافات OrderBy

إضافات OrderBy

ThenByDescending()

إضافات OrderBy

إضافات OrderBy

ToArray()

نتائج المرتبة

نتائج غير مرتبة

ToDictionary()

غير قابلة للتطبيق

غير قابلة للتطبيق

ToList()

نتائج المرتبة

نتائج غير مرتبة

ToLookup()

نتائج المرتبة

نتائج غير مرتبة

Union()

نتائج المرتبة

نتائج غير مرتبة

Where()

نتائج المرتبة

نتائج غير مرتبة

Where()تمت الفهرسة)

نتائج المرتبة

نتائج غير مرتبة

Zip()

نتائج المرتبة

نتائج غير مرتبة

راجع أيضًا:

المبادئ

متوازى LINQ (PLINQ)

البرمجة المتوازية في .NET Framework