একটি সি # ল্যাম্বডা এক্সপ্রেশন একটির বেশি বক্তব্য থাকতে পারে?


131

একটি সি # ল্যাম্বডা এক্সপ্রেশন একটির বেশি বিবৃতি অন্তর্ভুক্ত করতে পারে?

(সম্পাদনা করুন: নীচের বেশ কয়েকটি উত্তরে যেমন উল্লেখ করা হয়েছে, এই প্রশ্নটি মূলত "বক্তব্য" না দিয়ে "লাইন" সম্পর্কে জিজ্ঞাসা করেছিল))


17
হ্যাঁ, আপনি একাধিক লাইন ব্যবহার করতে পারেন। আমি এটির পুরো উত্তর বানাতে সঠিক বোধ করি না।
টেসেরেক্স

1
@ টেসারেক্স - কী উত্তর দেবে না ... আপনি ঠিক বলেছেন!
আরকিউকিউ

3
@ আরকিউকিউ, কারণ এটি হ্যাঁ বা কোনও প্রশ্ন নয়, আমি মনে করি না যে এটি উত্স থেকে উত্পন্ন উত্সাহের উপযুক্ত।
টেসেরেক্স

উত্তর:


195

নিশ্চিত:

List<String> items = new List<string>();

var results = items.Where(i => 
            {
                bool result;

                if (i == "THIS")
                    result = true;
                else if (i == "THAT")
                    result = true;
                else
                    result = false;

                return result;
            }
        );

31

(আমি ধরে নিচ্ছি আপনি সত্যিই একাধিক লাইনের পরিবর্তে একাধিক বক্তব্য সম্পর্কে কথা বলছেন))

আপনি ব্রেস ব্যবহার করে ল্যাম্বডা এক্সপ্রেশনটিতে একাধিক স্টেটমেন্ট ব্যবহার করতে পারেন, তবে কেবল সিনট্যাক্স যা ব্রেস ব্যবহার করে না সেগুলি এক্সপ্রেশন ট্রিতে রূপান্তরিত হতে পারে:

// Valid
Func<int, int> a = x => x + 1;
Func<int, int> b = x => { return x + 1; };        
Expression<Func<int, int>> c = x => x + 1;

// Invalid
Expression<Func<int, int>> d = x => { return x + 1; };

1
আমি বুঝতে চেষ্টা করছি যে কেন ফানক বন্ধনী এবং এক্সপ্রেশনকে অনুমতি দেয় না। যাইহোক এক্সপ্রেশন ফানক হিসাবে মেনে চলবে, এক্সপ্রেশন ট্রিটিতে একাধিক লাইন যুক্তি যুক্ত করার কোনও উপায় আছে কি? যদি না হয় তবে কেন এটি সীমাবদ্ধ রয়েছে?
হবিব

8
@ হাবিব: "যাইহোক এক্সপ্রেশন ফানক হিসাবে মেনে চলবে" সবসময় নয়। এটি কখনই কোনও প্রতিনিধিদের কাছে কখনই সংকলিত হয় না - কেবল ডেটা হিসাবে পরীক্ষা করা হয়। .NET 4.0 এ এক্সপ্রেশন ট্রি এক্সপ্রেশনের মাধ্যমে একাধিক বিবৃতি অন্তর্ভুক্ত করার ক্ষমতা অর্জন করেছে .ব্লক তবে সি # ভাষা সেটিকে সমর্থন করে না। এটি পারে, তবে এর জন্য আরও নকশা / বাস্তবায়ন / পরীক্ষার কাজ প্রয়োজন।
জন স্কিটি

26

ল্যাম্বডা এক্সপ্রেশনটিতে আপনি যতটা নতুন লাইন রাখতে চান তেমন রাখতে পারেন; সি # নিউলাইনগুলিকে উপেক্ষা করে।

আপনি সম্ভবত একাধিক বক্তব্য সম্পর্কে জিজ্ঞাসা করতে চেয়েছিলেন

একাধিক বিবৃতি ব্রেস মধ্যে আবৃত করা যেতে পারে।

ডকুমেন্টেশন দেখুন ।


17
সি # নিউলাইনস সহ সমস্ত সাদা স্থানকে সমানভাবে বিবেচনা করে বলা কি আরও সঠিক হবে না? এটি নতুন লাইনগুলিকে উপেক্ষা করে বলে কিছুটা বিভ্রান্তিকর বলে মনে হচ্ছে - এটি দেখে মনে হচ্ছে এটি কেবল তাদের সম্পূর্ণ আলাদা করে ফেলেছে এবং আপনি কোনও কীওয়ার্ডকে একটি নতুন লাইন বা কোনও কিছুতে বিভক্ত করতে পারেন।
টেসেরেক্স

6

যেহেতু সি # 7:

একক লাইন বিবৃতি:

int expr(int x, int y) => x + y + 1; 

একাধিক বক্তব্য:

int expr(int x, int y) { int z = 8; return x + y + z + 1; };

যদিও এগুলিকে স্থানীয় ফাংশন বলা হয় আমি মনে করি এটি নীচের চেয়ে কিছুটা পরিষ্কার দেখাচ্ছে এবং কার্যকরভাবে একই

Func<int, int, int> a = (x, y) => x + y + 1;

Func<int, int, int> b = (x, y) => { int z = 8; return x + y + z + 1; };

4
Func<string, bool> test = (name) => 
{
   if (name == "yes") return true;
   else return false;
}

5
ফানক <স্ট্রিং, বুল> পরীক্ষা = নাম => নাম == "হ্যাঁ";
asawyer

3
পলিসি গল্ফিং পরামর্শগুলি বিনোদন দিয়ে নয়, প্রশ্নটির দ্বারা অনুরোধ করা বহু-লাইন বিন্যাসটি প্রদর্শন করছে। আপনার বুদ্ধিমান কোডটি কার্যকর করতে এটি "উত্তর নয়" তৈরি করবে!
Caius Jard


0

সি # 7.0 এর সাহায্যে আপনি এটির মতোও ব্যবহার করতে পারেন

Public string ParentMethod(int i, int x){
    int calculation = (i*x);
    (string info, int result) InternalTuppleMethod(param1, param2)
    {
        var sum = (calculation + 5);
        return ("The calculation is", sum);
    }
}

0

আপনার একটি ক্লাস আছে বলে দিন:

    public class Point
    {
        public int X { get; set; }
        public int Y { get; set; }
    }

এই শ্রেণীর ভিতরে C # 7.0 এর সাহায্যে আপনি কোঁকড়ানো বন্ধনী ছাড়াই এটি করতে পারেন:

Action<int, int> action = (x, y) => (_, _) = (X += x, Y += y);

এবং

Action<int, int> action = (x, y) => _ = (X += x, Y += y);

যেমন হবে:

Action<int, int> action = (x, y) => { X += x; Y += y; };

এটি যদি আপনার একটি লাইনে নিয়মিত পদ্ধতি বা নির্মাণকারীর লেখার প্রয়োজন হয় বা যখন আপনার আরও বেশি প্রয়োজন হয় তবে একটি বিবৃতি / অভিব্যক্তিটি একটি অভিব্যক্তিতে প্যাক করার প্রয়োজন হলে এটি সহায়ক হতে পারে:

public void Action(int x, int y) => (_, _) = (X += x, Y += y);

অথবা

public void Action(int x, int y) => _ = (X += x, Y += y);

অথবা

public void Action(int x, int y) => (X, Y) = (X + x, Y + y);

ডকুমেন্টেশনে টিপলগুলির ডিকনস্ট্রাকশন সম্পর্কে আরও ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.