سؤال
كنت أتساءل إذا كان شخص ما يمكن أن يفسر ما Func<int, string>
هو وكيفية استخدامه مع بعض الأمثلة الواضحة.
المحلول
هل أنت على دراية المندوبين بشكل عام؟ لدي صفحة حول مما قد يساعد إذا لم يكن كذلك، على الرغم من انها موجهة أكثر نحو rel="noreferrer"> شرح الخلافات بين البلدين.
Func<T, TResult>
هو مجرد مندوب عام - العمل على ما يعنيه في أي حالة معينة عن طريق استبدال <م> المعلمات نوع م> (T
وTResult
) مع ما يوازيها <م> اكتب الحجج م> (int
وstring
) في الإعلان. لقد تسميته أيضا لتجنب الارتباك:
string ExpandedFunc(int x)
وبعبارة أخرى، Func<int, string>
هو مندوب الذي يمثل دالة اتخاذ حجة int
وإرجاع string
.
وكثيرا ما يستخدم Func<T, TResult>
في LINQ، سواء بالنسبة للتوقعات والمسندات (في الحالة الأخيرة، TResult
دائما bool
). على سبيل المثال، هل يمكن استخدام Func<int, string>
لمشروع سلسلة من الأعداد الصحيحة في سلسلة من السلاسل. تعبيرات لامدا م> تستخدم عادة في LINQ لإنشاء المندوبين ذات الصلة:
Func<int, string> projection = x => "Value=" + x;
int[] values = { 3, 7, 10 };
var strings = values.Select(projection);
foreach (string s in strings)
{
Console.WriteLine(s);
}
والنتيجة:
Value=3
Value=7
Value=10
نصائح أخرى
أ Func<int, string>
يأكل int ويعيد السلاسل.إذًا، ما الذي يأكل int ويعيد السلاسل؟وماذا عن هذا ...
public string IntAsString( int i )
{
return i.ToString();
}
هناك، قمت للتو بتكوين وظيفة تأكل int وترجع السلاسل.كيف يمكنني استخدامه؟
var lst = new List<int>() { 1, 2, 3, 4, 5 };
string str = String.Empty;
foreach( int i in lst )
{
str += IntAsString(i);
}
// str will be "12345"
أعلم أنها ليست مثيرة جدًا، لكن هذه هي الفكرة البسيطة التي تعتمد عليها الكثير من الحيل.الآن، دعونا نستخدم Func بدلاً من ذلك.
Func<int, string> fnc = IntAsString;
foreach (int i in lst)
{
str += fnc(i);
}
// str will be "1234512345" assuming we have same str as before
بدلاً من استدعاء IntAsString على كل عضو، قمت بإنشاء مرجع له يسمى fnc (تسمى هذه المراجع إلى الأساليب المندوبين) واستخدم ذلك بدلاً من ذلك.(تذكر أن fnc يأكل int ويعيد السلاسل).
هذا المثال ليس مثيرًا للغاية، ولكن الكثير من الأشياء الذكية التي ستراها تعتمد على فكرة بسيطة عن الوظائف والمفوضين و طرق التمديد.
واحدة من أفضل البادئات التي رأيتها في هذه الأشياء هي هنا.لديه الكثير من الأمثلة الحقيقية.:)
وهو مندوب يأخذ int
واحد كمعلمة وإرجاع قيمة من نوع string
.
وهنا مثال لاستخدامه:
using System;
class Program
{
static void Main()
{
Func<Int32, String> func = bar;
// now I have a delegate which
// I can invoke or pass to other
// methods.
func(1);
}
static String bar(Int32 value)
{
return value.ToString();
}
}
وFunc<int, string>
يقبل معلمة قيمة int و إرجاع قيمة السلسلة. وإليك مثال حيث طريقة دعم إضافي غير ضرورية.
Func<int, string> GetDogMessage = dogAge =>
{
if (dogAge < 3) return "You have a puppy!";
if (dogAge < 7) return "Strong adult dog!";
return "Age is catching up with the dog!";
};
string youngDogMessage = GetDogMessage(2);
ملحوظة: اخر نوع الكائن في وظائفها (أي "السلسلة" في هذا المثال) هو الدالات بإرجاع نوع (أي لا تقتصر على الأوليات، ولكن أي شيء). ولذلك، Func<int, bool, float>
تقبل المعلمات int و قيمة منطقي، وإرجاع قيمة تعويم.
Func<int, bool, float> WorthlessFunc = (intValue, boolValue) =>
{
if(intValue > 100 && boolValue) return 100;
return 1;
};
float willReturn1 = WorthlessFunc(21, false);
float willReturn100 = WorthlessFunc(1000, true);
وHTH