أي جزء من لغة C# هو .ForEach()؟
-
17-09-2020 - |
سؤال
إذا كنت أشرح ميزة 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 يعد أثرًا جانبيًا بطبيعته/عملية حتمية.
نصائح أخرى
إنها ليست طريقة تمديد 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.5ForEach
هي دعوة لSystem.Collections.Generic.List<T>.ForEach
تم تقديمه في .net Framework 2.0c =>
هو بناء جملة تعبير لامدا الذي تم تقديمه في الإصدار C# 3.0.
إذا نظرت إلى الوثائق ل List<T>.ForEach
, ، يمكنك رؤية بناء جملة المفوض القديم الذي كان مطلوبًا في ذلك الوقت للاتصال به.
سيتم توفير التأثيرات الجانبية في ملحقات Linq الخاصة بـ Visual Studio 2010.