الكتابة أساليب الإرشاد مع العمل / Func / مندوبين / لامبدا في VB و C#

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

سؤال

أولا لا أستطيع أن أستوعب الوظيفية / امدا الجوانب .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() المكالمة.

أن نفهم حقا كيف يعمل هذا ، أعتقد أكثر من حيث IEnumerables من القوائم.نفكر لماذا تعبيرين أدناه نفس النتيجة و لماذا هذا الأخير هو الأفضل عادة:

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.

ويساعد هذا الأمل.

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