سؤال

أقوم بنقل بعض رمز C ++ إلى C#.

هل C# لديه ما يعادل std::nth_element() أو هل أحتاج إلى لف بلدي؟

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

المحلول

أفترض أنك تبحث عن ملحق بإرجاع العنصر التاسع لمجموعة غير مرتبة من خلال أداء الجزأي على المجموعة. يميل هذا إلى أن يكون مفيدًا عندما يكون لديك مجموعة كبيرة جدًا وتهتم بواحد من العناصر الأولى بناءً على بعض المسند.

على حد علمي ، لا توفر ملحقات .NET BCL أو LINQ مكافئًا. جميع طرق الفرز (بما في ذلك enumerable.orderby) تؤدي طلبًا كاملاً للمجموعة.

إذا كنت بحاجة إلى إصدار فعال من NTH ، فستحتاج إلى لف طريقة التمديد الخاصة بك على iEnumerable للقيام بذلك. إذا كنت ستقوم بتدحرجك ، فقد ترغب في النظر إلى خوارزمية تحديد سريعة, ، الذي لديه الأداء o (n).

إذا كان إصدار القوة الغاشمة كافية ، فيمكنك استخدام LINQ:

var someCollection = new []{ 5, 2, 8, 9, 0, 1, 3, 12, 4 };

var fifthItem = someCollection.NthItem(5);

public static class NthExtensions 
{
    public static T NthItem(this IEnumerable<T> coll, int n) 
    {
        return coll.OrderBy(x => x).Skip(n - 1).First();
    }
}

نصائح أخرى

لا ، لا. سيكون عليك كتابة خوارزمية الاختيار (على الأرجح حدد مسرعا) باليد.

ليس هناك ما يعادلها المباشر. يمكنك ، من المحتمل ، استخدام Orderby من LINQ وتأخذ/تخطي لتحقيق نفس الأهداف على أي شيء لا يطاق ، ولكن سيتم فرز المجموعة بأكملها في هذه العملية.

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