سؤال

إذا كنت أشرح ميزة ForEach التالية لشخص ما، فهل من الصحيح أن أقول إن رقم 2 هو "نهج LINQ foreach"أم أنه مجرد"List<T> طريقة التمديد"غير مرتبط رسميًا بـ LINQ؟

var youngCustomers = from c in customers
                     where c.Age < 30
                     select c;

//1. traditional foreach approach
foreach (var c in youngCustomers)
{
    Console.WriteLine(c.Display());
}

//2. LINQ foreach approach?
youngCustomers.ToList().ForEach(c => Console.WriteLine(c.Display()));
هل كانت مفيدة؟

المحلول

إنها طريقة عادية ل List<T> على الرغم من أن الأشخاص غالبًا ما يقدمون طرق الإرشاد الخاصة بهم للآخرين IEnumerable<T>. لا يوفر LINQ امتداد ForEach نظرًا لأهداف تصميمه المتمثلة في كونه وظيفيًا/العمل مع أنواع غير قابلة للتغيير، فإن ForEach يعد أثرًا جانبيًا بطبيعته/عملية حتمية.

نصائح أخرى

لا علاقة لها بـ LINQ وليست طريقة تمديد.

ForEach هي طريقة مثيل واضحة على List<T> فصل.

(وإذا أردت أن تكون دقيقًا حقًا، إذن ForEach ليس جزءًا من لغة C# على الإطلاق:إنه جزء من مكتبة .NET Base Class.)

إنها ليست طريقة تمديد List<T>, ، إنها طريقة عادية List<T>.

لذلك لا علاقة له بـ LINQ.إذا كان الأمر كذلك، فإن التمييز بين "المرتبط رسميًا بـ LINQ" وغير المرتبط رسميًا بـ LINQ ليس مفيدًا عمليًا.LINQ هي ببساطة مجموعة من طرق الامتداد المتسلسلة (غالبًا ما تكون على IEnumerable<T>).نادرًا ما يكون هناك أي فائدة في تمييزه عن طرق التمديد الأخرى IEnumerable<T>.أفضل تمييز هو أنهم يقيمون في واحدة من System.Linq أو System.Something.Linq مساحات الأسماء.

انها ليست لينك.أحد جوانب تصميم LINQ هو أن طرق LINQ القياسية ليس لها آثار جانبية.قد تنتهك طريقة ForEach هذا.

لدى إريك ليبرت مقالة مدونة تتحدث عن هذا الأمر:

http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx

youngCustomers.ToList().ForEach(c => Console.WriteLine(c.Display())); 

دعونا نقسمها:

  • ToList هي دعوة ل System.Linq.Enumerable.ToList() تم تقديمه في ‎.net Framework 3.5
  • ForEach هي دعوة ل System.Collections.Generic.List<T>.ForEach تم تقديمه في ‎.net Framework 2.0
  • c => هو بناء جملة تعبير لامدا الذي تم تقديمه في الإصدار C# 3.0.

إذا نظرت إلى الوثائق ل List<T>.ForEach, ، يمكنك رؤية بناء جملة المفوض القديم الذي كان مطلوبًا في ذلك الوقت للاتصال به.

سيتم توفير التأثيرات الجانبية في ملحقات Linq الخاصة بـ Visual Studio 2010.

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