سؤال

كنت أتساءل إذا كان شخص ما يمكن أن يفسر ما 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

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