سؤال

في مشروع أعمل على، هناك مجموعات كبيرة حقا (عناصر 1M-1B)، ويتم تعديل الأمور إلى مجموعات في الغالب.

وانها التطبيق في الوقت الحقيقي، وبالتالي فإن أداء هو الهدف الأسمى.

لبعض العمليات، مثل عكسي، BinarySearch (ممكن؟)، وما إلى ذلك سوف تعاني أكثر من غيرها مثل تحديد، وما إلى ذلك.

هل من الممكن لتنفيذ المرء IEnumerable مع MOVENEXT ممكن، MovePrev، الخ، ونملك تنفيذ ملحقات LINQ أن استفادة من هذه؟

وإذا كان هذا يحدث ستعمل، انها ستعمل يحدث في نهاية المشروع. لأننا في حاجة للحصول على انها تعمل أولا، ثم جعلها أسرع.

وجميع في كل هذا لا ينبغي أن يكون الكثير من العمل، أليس كذلك؟

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

المحلول

وانها بالتأكيد جدا الممكنة لخلق تنفيذ الخاص بك من Enumerable التي قد حالة خاصة بعض الحالات. كنت تريد أساسا للكشف عن أنواع الخاصة بك جمع (أو ربما مجموعات فقط مثل List<T>) واستخدام تطبيق أكثر كفاءة حيثما ينطبق ذلك.

ولدي عينة مشروع حيث كنت التجريبي "تنفيذ LINQ إلى كائنات في ساعة واحدة "التي قد ترغب في النظر في أمثلة. انها ليست التنفيذ الكامل وعلى وجه الخصوص انها <م> أقل كفاءة من LINQ الحقيقي للكائنات - ولكن قد لا تزال تجد أنها مثيرة للاهتمام

وبدلا من ذلك، قد تجد أن i4o (المفهرسة LINQ) يفعل كل ما تحتاجه من خارج منطقة الجزاء - أو أن تكون أفضل حالا التبرع لذلك من البدء من نقطة الصفر. تستحق التدقيق بها.

وفقط تذكر أنه في نهاية اليوم، LINQ هو في الأساس تصميم جميل إلى جانب نحوي السكر. وC # المترجم لا يعرف <م> أي شيء خاص حول System.Linq.Enumerable، على سبيل المثال.

نصائح أخرى

إذا كنت تريد حقا الأداء، يمكنك أن تفعل الكثير جدا. تذكر أن الاختيار التالية:

var result = from element in collection
             where element.Id == id
             select element;

ويجمع على النحو التالي:

var result = collection.Where(element => element.Id == id);

إذا قمت بإنشاء الأسلوب التالي لنوع collection، ثم يمكنك استغلال حقيقة أن العمل الأساسي هو المساواة بين عضو إيد والتعامل مع الطلب بطريقة الأمثل. الشيء المهم هو صحيح تحديد عمليات أداء حاسم على جمع واختيار الخوارزميات الصحيحة (تعقيد أي) على أدائها.

public IEnumerable<TElement> Where(Expression<Func<TElement, bool>> selector)
{
    // detect equality of the Id member and return some special value
}

والنظر System.Linq.Enumerable.Reverse () - هذه الطريقة يعدد تماما IEnumerable قبل أن تعود النتيجة الأولى

إذا طلبك هو myCollection.Reverse () خذ (10)، وجمع لديه المليارات من البنود، انها فكرة رهيبة تعداد المليارات من العناصر للحصول على 10 من أصل.

إذا قمت بتوفيرها وسيلة عكسي على نوع خاص بك، هل يمكن تزويد تنفيذ أفضل أن مجرد حلقات الخلف خلال جمع (عن طريق مؤشر ربما).

والمفتاح لهذا هو تزويد نوع الخاصة بك حيث يمكنك التحكم في التطبيقات. لا يمكنك استخدام تطبيقات التي تعمل من أجل كل IEnumerable<T> لأن تلك التطبيقات لا الاستفادة الكاملة من قدرات الخاص بك نوع مجموعة مخصصة.

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

هل من الممكن لتنفيذ المرء   IEnumerable مع الممكن MOVENEXT،   MovePrev، وغيرها، وتملك LINQ تنفيذها   الملحقات التي تأخذ مزايا   هذه؟

وIEnumerable (أو أكثر بشكل صحيح، IEnumerator) لم يقم MovePrev. هل يمكن تحديد واجهة:

public interface IReversable<T> : IEnumerable<T>
{
    IEnumerator<T> GetReverseEnumerator();
}

ويمكن تنفيذ ذلك من خلال أي الحاوية التي تدعم كفاءة العد العكسي.

ويمكنك بعد ذلك كتابة الزائد من Reverse (طريقة التمديد) للعمل خارج هذه الواجهة الجديدة، وجمع الصفوف التي تنفذ واجهة، وغيرها، وبعد ذلك عليك أن تستخدم تلك الفئات جمع بدلا من تلك القياسية مثل List<T> .

ولكن (ليس لدي العاكس مفيد للتحقق) قد يكون من المدمج في Reverse ذكي بما فيه الكفاية للقيام بأمور طريقة سريعة إذا كان يمكن الحصول على واجهة IList من المجموعة، التي من شأنها تحسين الأكثر شيوعا الحالات على ما يرام على أي حال.

وهكذا قد لا يكون هناك الكثير من نقطة في هذا النوع من النهج.

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