سؤال

هل من الممكن هكتار هاء التحول في تعبير لامدا؟ إذا لم يكن كذلك، لماذا؟ Resharper عرض على أنها خطأ.

هل كانت مفيدة؟

المحلول

ويمكنك في امدا كتلة البيان:

Action<int> action = x =>
{
  switch(x)
  {
    case 0: Console.WriteLine("0"); break;
    default: Console.WriteLine("Not 0"); break;
  }
};

ولكن لا يمكنك أن تفعل ذلك في "لامدا تعبير واحد"، لذلك هذا هو غير صالح:

// This won't work
Expression<Func<int, int>> action = x =>
  switch(x)
  {
    case 0: return 0;
    default: return x + 1;
  };

وهذا يعني أنك لا يمكن استخدام التبديل في شجرة التعبير (على الأقل كما تم إنشاؤها بواسطة C # مترجم، أعتقد NET 4.0 لديها ما لا يقل عن الدعم له في المكتبات)

.

نصائح أخرى

في لExpression نقية (في. NET 3.5)، والأقرب يمكنك الحصول على مركب مشروطة:

    Expression<Func<int, string>> func = x =>
        x == 1 ? "abc" : (
        x == 2 ? "def" : (
        x == 3 ? "ghi" :
                 "jkl")); /// yes, this is ugly as sin...

وليس متعة، خصوصا عندما يحصل تعقيدا. إذا كنت تعني التعبير LAMDA مع هيئة بيان (فقط للاستخدام مع LINQ إلى كائنات)، ثم كل شيء قانوني داخل الأقواس:

    Func<int, string> func = x => {
        switch (x){
            case 1:  return "abc";
            case 2:  return "def";
            case 3:  return "ghi";
            default: return "jkl";
        }
    };

وبطبيعة الحال، قد تكون قادرة على الاستعانة بمصادر خارجية في العمل؛ على سبيل المثال، LINQ SQL-إلى-يسمح لك لتعيين UDF العددية (في قاعدة البيانات) إلى أسلوب على السياق البيانات (التي لا تستخدم في الواقع) - على سبيل المثال:

var qry = from cust in ctx.Customers
          select new {cust.Name, CustomerType = ctx.MapType(cust.TypeFlag) };

وحيث MapType هو UDF أن يفعل العمل في خادم ديسيبل.

ونعم، وأنها تعمل، ولكن لديك لوضع التعليمات البرمجية في كتلة. مثال:

private bool DoSomething(Func<string, bool> callback)
{
    return callback("FOO");
}

وبعد ذلك، أن نسميها:

DoSomething(val =>
                {
                    switch (val)
                    {
                        case "Foo":
                            return true;

                        default:
                            return false;
                    }
                });

وهم، لا أرى أي سبب لماذا هذا لا ينبغي أن العمل. فقط كن حذرا مع بناء الجملة التي تستخدمها

param => {
    // Nearly any code!
}

delegate (param) {
    // Nearly any code!
}

param => JustASingleExpression (No switches)

وراجعت ذلك أيضا: -)

[Test]
public void SwitchInLambda()
{
    TakeALambda(i => {
        switch (i)
        {
            case 2:
                return "Smurf";
            default:
                return "Gnurf";
        }
    });
}

public void TakeALambda(Func<int, string> func)
{
    System.Diagnostics.Debug.WriteLine(func(2));
}

ويعمل على ما يرام (المخرجات "الحوت")!

ولقد تعلم هذا:

                      (model) =>
                                {
                                    switch(model.SentInvoiceTypeId)
                                    {
                                        case 1:
                                            return "1 asdf";
                                        case 2:
                                            return "2 asdf";
                                        case 3:
                                            return "3 asdf ";
                                        case 4:
                                            return "4 asdf ";
                                        default:
                                            return "asdf";
                                    }
                                }

وضعت للتو بين "النموذج" () وإضافة التعليمات البرمجية في {}، وتذكر لديك العودة.
ولست متأكدا التي إصدارات C # ستعمل، في هذا المثال هو C # 7.0

وآمل أن يكون هذا الجواب يمكن أن يساعد شخص ما.

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