أحتاج إلى تكرار والاعتماد.ما هو أسرع أو المفضل:ToArray() أو ToList()?[مكررة]

StackOverflow https://stackoverflow.com/questions/1826658

سؤال

ممكن مكررة:
هل الأفضل أن ندعو ToList() أو ToArray() في استعلامات LINQ?

لدي رمز مثل هذا:

void Foobar(string[] arr, Dictionary<string, string[]>)
{
   var t = arr.Intersect(dic.Keys).ToList(); // .or ToArray() ?
   foreach(var item in t)
   {
      ..
   }

   var j = t.Count; // also I need this
}

وهو الأسلوب المفضل ؟

أنا يمكن أن تذهب من دون أي ولكن أريد أن أعرف حجم و أنا لا أريد أن أتصل Enumerable.Count<T>() - يبدو أن تفعل المزيد من الأعمال ثم Array<T>.Size أو List<T>.Count.هل أنا محق ؟

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

المحلول

في الواقع, في التيار MS تنفيذ عدد(IEnumerable) هناك اختصار البحث إذا كانت IEnumerable هو ICollection المكالمات الاعتماد على ذلك.وبالتالي فإن الأداء ينبغي أن تكون قابلة للمقارنة لحساب العناصر.

ToList و ToArray قليلا نفس.إذا كان IEnumerable هو ICollection ، ثم CopyTo الأسلوب يسمى بدلا ، وهو أسرع قليلا.

لذا اختر ما يجعل التعليمات البرمجية الخاصة بك الأكثر قابلية للقراءة ، وقياس للاستخدام الخاص بك الحال إلى إجابة محددة.

تحديث:لم ساذجة المعيار.

بدءا من مجموعة: var items = Enumerable.Range(1,1000).ToArray();

  • داعيا ToList() :25ms / 10000
  • داعيا ToArray() :23 ms / 10000

بدءا من IEnumerable: var items = Enumerable.Range(1,1000);

  • داعيا ToList() :168ms / 10000
  • داعيا ToArray() :171 ms / 10000

وذلك أساسا يمكنك الحصول على الأداء مقارنة.

نصائح أخرى

إذا كنت حقا قلق الأداء ، يجب أن حلقة على IEnumerable و الاعتماد عليه كما تذهب.هذا يتجنب الحاجة إلى إنشاء مجموعة جديدة تماما ، وتقاطع فقط أن يتحرك مرة واحدة:

void Foobar(string[] arr, Dictionary<string, string[]>)
{
   var t = arr.Intersect(dic.Keys);
   int count = 0;
   foreach(var item in t)
   {
      count++;
      ..
   }

   var j = count;
}

ولكن مثل أي شخص آخر قال:هذه الروائح الصغرى الأمثل.إذا كان الأداء يهم حقا في هذه الحالة ، على الأقل القيام الأداء التنميط لمعرفة الأسلوب الذي هو حقا أسرع بالنسبة لك.

الفرق هو ربما لذلك هو يستحق كل هذا فقط باستخدام الأسلوب الذي يناسب احتياجاتك بشكل أفضل.رائحة الصغرى الأمثل.

و في هذه الحالة, لأن كل ما تقوم به هو تعداد مجموعة عد مجموعة (سواء التي يمكنك القيام به مع IEnumerable), لماذا لا مجرد ترك الأمر باعتباره IEnumerable<>?

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