سؤال

أستخدم تعليمات LINQ to Objects في مصفوفة مرتبة.ما هي العمليات التي لا ينبغي عليّ القيام بها للتأكد من عدم تغيير ترتيب المصفوفة؟

هل كانت مفيدة؟

المحلول

لقد درست أساليب System.Linq.Enumerable, ، مع تجاهل أي نتائج غير IEnumerable.لقد قمت بمراجعة ملاحظات كل منهم لتحديد مدى اختلاف ترتيب النتيجة عن ترتيب المصدر.

يحفظ النظام على الاطلاق.يمكنك تعيين عنصر مصدر بواسطة الفهرس إلى عنصر نتيجة

  • AsEnumerable
  • يقذف
  • كونكات
  • يختار
  • لمجموعة
  • لإدراج

يحفظ النظام.تتم تصفية العناصر، ولكن لا يتم إعادة ترتيبها.

  • متميز
  • يستثني
  • تتقاطع
  • من النوع
  • يتخطى
  • تخطي بينما
  • يأخذ
  • خذ بينما
  • أين
  • الرمز البريدي (جديد في .net 4)

يدمر النظام - لا نعرف الترتيب الذي نتوقع ظهور النتائج فيه.

  • إلى القاموس
  • للبحث عن

يعيد تعريف الترتيب بشكل صريح - استخدمه لتغيير ترتيب النتيجة

  • ترتيب حسب
  • ترتيب حسب التنازل
  • يعكس
  • ثم بواسطة
  • ثم حسب التنازلي

يعيد تعريف النظام وفقًا لبعض القواعد.

  • GroupBy - يتم إنتاج كائنات IGrouping بترتيب يعتمد على ترتيب العناصر الموجودة في المصدر التي أنتجت المفتاح الأول لكل IGrouping.يتم عرض العناصر الموجودة في المجموعة بالترتيب الذي تظهر به في المصدر.
  • GroupJoin - يحافظ GroupJoin على ترتيب العناصر الخارجية، ولكل عنصر خارجي، ترتيب العناصر المطابقة من الداخلية.
  • الانضمام - يحافظ على ترتيب العناصر الخارجية، ولكل عنصر من هذه العناصر، ترتيب العناصر المطابقة للداخلية.
  • SelectMany - لكل عنصر من عناصر المصدر، يتم استدعاء المحدد وإرجاع سلسلة من القيم.
  • Union - عندما يتم تعداد الكائن الذي يتم إرجاعه بهذه الطريقة، يقوم Union بتعداد الأول والثاني بهذا الترتيب وينتج كل عنصر لم يتم إنتاجه بالفعل.

يحرر:لقد قمت بنقل المميز إلى الحفاظ على النظام بناءً على هذا تطبيق.

    private static IEnumerable<TSource> DistinctIterator<TSource>
      (IEnumerable<TSource> source, IEqualityComparer<TSource> comparer)
    {
        Set<TSource> set = new Set<TSource>(comparer);
        foreach (TSource element in source)
            if (set.Add(element)) yield return element;
    }

نصائح أخرى

وأنت تتحدث فعلا عن SQL، أو على وشك المصفوفات؟ وبعبارة أخرى، هل تستخدم LINQ إلى SQL أو LINQ إلى كائنات؟

ووLINQ إلى كائنات المشغلين في الواقع لا يغير مصدر البيانات الأصلي - يبنون تسلسل والتي تدعمها بشكل فعال من قبل مصدر البيانات. عمليات الوحيدة التي تغير ترتيب وOrderBy / OrderByDescending / ThenBy / ThenByDescending - وحتى ذلك الحين، وتلك هي مستقرة لعناصر أمر على حد سواء. وبطبيعة الحال، فإن العديد من عمليات تصفية بعض العناصر، ولكن العناصر التي تم إرجاعها تكون في نفس النظام.

إذا تحول إلى بنية بيانات مختلفة، على سبيل المثال مع ToLookup أو ToDictionary، وأنا لا أعتقد هو الحفاظ على النظام في هذه النقطة - ولكن هذا يختلف إلى حد ما على أي حال. (يتم الاحتفاظ ترتيب الخرائط القيم إلى نفس المفتاح على عمليات البحث على الرغم من أنني أعتقد).

إذا كنت تعمل على صفيف، هذا يبدو وكأنه كنت تستخدم LINQ إلى كائنات لا SQL. هل يمكنك تأكيد؟ معظم العمليات LINQ لا إعادة ترتيب أي شيء (سوف يكون الإخراج في نفس الترتيب كما المدخلات) - حتى لا ينطبق نوع آخر (OrderBy [تنازلي] / ThenBy [تنازلي])

[تحرير: كما قال جون أكثر وضوحا. يخلق LINQ عموما <م> الجديد تسلسل، وترك البيانات الأصلية وحدها]

لاحظ أن دفع البيانات إلى Dictionary<,> (ToDictionary) سوف يتبارى البيانات، والقاموس لا يحترم أي ترتيب معين.

ولكن الأمور الأكثر شيوعا (حدد، أين، اقفز، خذ) يجب أن يكون على ما يرام.

ولقد وجدت الجواب كبيرة في سؤال مشابه التي تشير الوثائق الرسمية. أن أقتبس ما يلي:

لأساليب Enumerable (LINQ إلى كائنات الذي ينطبق على List<T>)، يمكنك الاعتماد على ترتيب العناصر التي تم إرجاعها بواسطة Select، Where، أو GroupBy. ليست هذه هي الحال بالنسبة للأشياء التي بطبيعتها غير مرتبة مثل ToDictionary أو Distinct.

<اقتباس فقرة>   

Enumerable.GroupBy الوثائق:

     

وأسفرت عن كائنات IGrouping<TKey, TElement> في أمر بناء على ترتيب العناصر في مصدر التي أنتجت المفتاح الأول لكل IGrouping<TKey, TElement>. وأسفرت العناصر في تجمع في ترتيب ظهورها في source.

وهذا ليس صحيحا بالنسبة لطرق الإرشاد IQueryable (مقدمي LINQ الأخرى).

بالضرورة

المصدر: هل طرق Enumerable LINQ في الحفاظ على النظام النسبي من عناصر؟

وأي "مجموعة من" أو "ترتيب بواسطة 'من المحتمل تغيير النظام.

والسؤال هنا يشير تحديدا إلى LINQ إلى كائنات.

إذا باستخدام LINQ إلى SQL بدلا ليس هناك النظام هناك إلا إذا فرض واحد مع شيء من هذا القبيل:

mysqlresult.OrderBy(e=>e.SomeColumn)

إذا كنت لا تفعل هذا مع LINQ إلى SQL ثم ترتيب النتائج يمكن أن تختلف بين الاستعلامات اللاحقة، حتى من نفس البيانات، والتي يمكن أن تتسبب في حدوث خلل intermittant.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top