الكتابة أساليب الإرشاد مع العمل / Func / مندوبين / لامبدا في VB و C#
-
05-07-2019 - |
سؤال
أولا لا أستطيع أن أستوعب الوظيفية / امدا الجوانب .NET framework 3.5.يمكنني استخدام هذه الميزات اليومية في LINQ, ولكن مشكلتي هي فهم وتنفيذ ما تعنيه حقا (لامدا?النظام.ظائفها?الخ الخ)
مع هذا في الاعتبار, كيف بعد أن يتحقق:
كمثال على ذلك, أود أن يكون امتدادا طريقة قائمة(T) الذي يحدد خصائص جميع الكائنات في القائمة إلى قيمة معينة ، وإرجاع تحديث قائمة(T).فإنه يمكن أن يسمى مثل هذا:
VB:
Dim someList As List(Of TextBox) = (New List(Of TextBox)).UpdateExtension(Function(txtb) txtb.Text = "something")
C#:
List<TextBox> someList = (new List<TextBox>()).UpdateExtension(txtb => txtb.Text = "something");
ما من شأنه أن طريقة التمديد في كل VB و C# ؟
أنا.هـ:
<Extension()> _
Public Function UpdateExtension(Of T)(ByVal source As List(Of T), ByVal predicate As ??) As List(Of T)
'??
End Function
هتاف!
تحرير
كما أشار إلى أعلاه يمكن أن يتحقق ، أكثر أو أقل،.ForEach().ولكن اهتمامي هو في understading كيف شيء من هذا القبيل .ForEach() ينفذ أيأنا مهتم في تنفيذ حل المشكلة المذكورة أعلاه.
المحلول
حقا أنت miking و مطابقة أساليب الإرشاد هنا.انها تقريبا مزيج من اختيار ForEach.يبدو أنك تريد طريقة من شأنها أن تسمح لك تعديل عناصر القائمة والعودة الأصلي التعداد.التالية ينبغي أن تفعل خدعة لك.
VB.Net
<Extension()> _
Public Function UpdateExtension(Of T)(ByVal source As IEnumerable(Of T), ByVal del As Action(Of T)) As IEnumerable(Of T)
For Each cur in source
del(cur)
Next
Return source
End Function
C#
public static IEnumerable<T> UpdateExtension<T>(this IEnumerable<T> source, Action<T> del) {
foreach ( var cur in source ) {
del(cur);
}
return source;
}
نصائح أخرى
باستثناء أنه يمكنك تعديل قائمة في المكان بدلا من العودة واحدة جديدة, هذا هو مجرد .ForEach()
المكالمة.
أن نفهم حقا كيف يعمل هذا ، أعتقد أكثر من حيث IEnumerable
s من القوائم.نفكر لماذا تعبيرين أدناه نفس النتيجة و لماذا هذا الأخير هو الأفضل عادة:
MyEnumerable.Count() > 2
MyEnumerable.Skip(2).Any()
للمساعدة في تحقيق هذا الهدف ، إعادة تنفيذ بعض القياسية IEnumerable امتداد باستخدام C#'s yield
الكلمات الرئيسية.مرة واحدة يمكنك الحصول على حقا لماذا 2nd أداء أفضل يجب أن تكون في حالة جيدة.
أما بالنسبة أساسية مختلفة مندوب أنواع أنت فقط بحاجة إلى أن نتعلم منهم.التفكير Func
كما الأساسية المشتركة مندوب ، حيث يمكنك تحديد نوع الوسيطة والعودة نوع نوع عام المعلمات.ثم التفكير في Action
باعتبارها حالة خاصة من Func
حيث نوع الإرجاع هو باطل ، Predicate
باعتبارها حالة خاصة حيث نوع الإرجاع هو منطقي.
يتم تنفيذ التمديدات في فئة ثابتة من خلال أساليب ثابتة أن تأخذ الهدف من التمديد كما المعلمة الأولى يسبقه هذه الكلمة.لتنفيذ المثال الخاص بك وأود أن تفعل:
public static class ListBoxExtensions
{
public static List<TextBox> SetToValue(this List<TextBox> txtBoxes, string sValue)
{
txtBoxes.ForEach(txtBox => txtBox.Text = sValue);
return txtBoxes;
}
}
واستخدام هذا على نموذج Windows 3 مربعات النص:
private void Form1_Load(object sender, EventArgs e)
{
List<TextBox> boxes = new List<TextBox>
{
textBox1,
textBox2,
textBox3
}.SetToValue("Hello");
}
آسف - لا تتحدث VB.
ويساعد هذا الأمل.