পদ্ধতি # প্যারামিটার হিসাবে সি # লম্বা এক্সপ্রেশন


105

আমার কাছে একটি ল্যাম্বডা এক্সপ্রেশন রয়েছে যা আমি পাস করতে এবং পুনরায় ব্যবহার করতে সক্ষম হতে চাই। কোডটি এখানে:

public List<IJob> getJobs(/* i want to pass the lambda expr in here */) {
  using (SqlConnection connection = new SqlConnection(getConnectionString())) {
    connection.Open();
    return connection.Query<FullTimeJob, Student, FullTimeJob>(sql, 
      (job, student) => {         
        job.Student = student;
        job.StudentId = student.Id;
        return job;
        },
        splitOn: "user_id",
        param: parameters).ToList<IJob>();   
  }   

এখানে মূল কী, আমি ল্যাম্বডা এক্সপ্রেশনটি পাস করতে সক্ষম হতে চাই যা এই কোডটি কল করছে এমন পদ্ধতিতে আমি এখানে ব্যবহার করছি, তাই আমি এটি পুনরায় ব্যবহার করতে পারি। ল্যাম্বডা এক্সপ্রেশনটি আমার। কীওয়ার পদ্ধতির অভ্যন্তরে দ্বিতীয় তর্ক। আমি ধরে নিচ্ছি আমি কোনও অ্যাকশন বা ফুনক ব্যবহার করতে চাই, তবে সিনট্যাক্সটি এর জন্য কী বা এটি কীভাবে কার্যকর তা আমি যথেষ্ট নিশ্চিত নই। কেউ দয়া করে আমাকে একটি উদাহরণ দিতে পারেন?


3
পরামিতিটিকে একটি ক্রিয়া বা একটি ফানক করুন।
মেট্রো স্মুরফ

ঠিক আছে, আমি যা ভেবেছিলাম ... আমি কীভাবে এটি করব তার একটি উদাহরণ দেখাতে পারেন?
অ্যাডাম লেভিট

উত্তর:


122

Func<T1, T2, TResult>প্যারামিটার টাইপ হিসাবে একটি প্রতিনিধি ব্যবহার করুন এবং এটি আপনার মধ্যে প্রবেশ করান Query:

public List<IJob> getJobs(Func<FullTimeJob, Student, FullTimeJob> lambda)
{
  using (SqlConnection connection = new SqlConnection(getConnectionString())) {
    connection.Open();
    return connection.Query<FullTimeJob, Student, FullTimeJob>(sql, 
        lambda,
        splitOn: "user_id",
        param: parameters).ToList<IJob>();   
  }  
}

আপনি এটি কল করবে:

getJobs((job, student) => {         
        job.Student = student;
        job.StudentId = student.Id;
        return job;
        });

অথবা ল্যাম্বডাকে একটি ভেরিয়েবলের জন্য বরাদ্দ করুন এবং এটি পাস করুন ।


এটি দেখতে খুব ভাল লাগছে, এবং আমি কীভাবে এই getJobs পদ্ধতিতে ল্যাম্বডাকে বাইরে সংজ্ঞা দেব? অন্য কথায়, জবসকে () দেখতে ল্যাম্বডাকে সংজ্ঞায়িত করার মতো কল করার আগে লাইনটি কী?
অ্যাডাম লেভিট

@ অ্যাডাম লেভিট - আপনার উদাহরণ কোড সহ আপনার একই পদ্ধতি। উত্তর যুক্ত হবে।
ওদেড

এছাড়াও, ফাংশন পরামিতি যাইহোক গতিশীল হতে পারে?
অ্যাডাম লেভিট

@ অ্যাডাম লেভিট - আপনি ফাংশনটি জেনেরিক তৈরি করতে পারেন, যদিও আপনি ল্যাম্বডাসে বিভিন্ন সংখ্যক পরামিতি চান, আপনার প্রয়োজনের অতিরিক্ত প্রয়োজন।
ওদেড

ঠিক। আমি আসলে যা চাই তা হ'ল আই জব ইন্টারফেসের বিভিন্ন বাস্তবায়নে পাস করতে সক্ষম হওয়া, তবে এটি ডাপারের ক্যোয়ারির সাথে কাজ করবে না <> কারণ এটি রান টাইমে আসল জেনেরিক ইমপ্লাস ক্লাসের প্রয়োজন। আমি এখনও যা আশা করেছিলাম এটি তার কাছাকাছি।
অ্যাডাম লেভিট

27

যদি আমি বুঝতে পারি আপনার নিম্নলিখিত কোডের প্রয়োজন। (পরামিতি দ্বারা এক্সপ্রেশন লাম্বদা পাস) পদ্ধতি

public static void Method(Expression<Func<int, bool>> predicate) { 
    int[] number={1,2,3,4,5,6,7,8,9,10};
    var newList = from x in number
                  .Where(predicate.Compile()) //here compile your clausuly
                  select x;
                newList.ToList();//return a new list
    }

কল করার পদ্ধতি

Method(v => v.Equals(1));

আপনি তাদের শ্রেণিতেও এটি করতে পারেন, দেখুন এটির উদাহরণ।

public string Name {get;set;}

public static List<Class> GetList(Expression<Func<Class, bool>> predicate)
    {
        List<Class> c = new List<Class>();
        c.Add(new Class("name1"));
        c.Add(new Class("name2"));

        var f = from g in c.
                Where (predicate.Compile())
                select g;
        f.ToList();

       return f;
    }

কল করার পদ্ধতি

Class.GetList(c=>c.Name=="yourname");

আমি আশা করি এটি কার্যকর হবে


2
আপনি ব্যাখ্যা করতে পারেন কেন আমরা প্রয়োজন Compile()মধ্যে .Where? আমি এটাও ছাড়া কাজ করে দেখেছি।
Sнаđошƒаӽ

7

লাম্বদা এক্সপ্রেশনগুলির একটি ধরণের Action<parameters>(যদি তারা কোনও মান ফেরত না দেয়) বা Func<parameters,return>(যদি তাদের কোনও ফেরতের মান থাকে) have আপনার ক্ষেত্রে আপনার দুটি ইনপুট প্যারামিটার রয়েছে এবং আপনার কোনও মান ফেরত দেওয়া দরকার, তাই আপনার ব্যবহার করা উচিত:

Func<FullTimeJob, Student, FullTimeJob>

5

আপনার কোনও প্রতিনিধি প্রকারটি ব্যবহার করা উচিত এবং এটি আপনার কমান্ড প্যারামিটার হিসাবে নির্দিষ্ট করা উচিত। আপনি বিল্ট ইন ডেলিগেট টাইপের একটি ব্যবহার করতে পারেন - Actionএবং Func

আপনার ক্ষেত্রে, দেখে মনে হচ্ছে আপনার প্রতিনিধি দুটি প্যারামিটার নেয় এবং ফলাফলটি ফেরত দেয়, তাই আপনি ব্যবহার করতে পারেন Func:

List<IJob> GetJobs(Func<FullTimeJob, Student, FullTimeJob> projection)

তারপরে GetJobsআপনি কোনও ডেলিগেটের ক্ষেত্রে আপনার পদ্ধতিটি পাস করার জন্য কল করতে পারেন । এটি এমন একটি পদ্ধতি হতে পারে যা সেই স্বাক্ষর, বেনামে প্রতিনিধি বা ল্যাম্বডা অভিব্যক্তির সাথে মেলে।

পিএস আপনার পদ্ধতির নামগুলির জন্য পাসকেলকেস ব্যবহার করা উচিত - GetJobsনা getJobs

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