চেইনেড লিনকিউ এক্সটেনশন পদ্ধতি কলগুলিতে 'লেট' কীওয়ার্ডের সমান কোড


191

সি # সংকলকগুলির ক্যোয়ারী অনুধাবন বৈশিষ্ট্যগুলি ব্যবহার করে আপনি কোড লিখতে পারেন:

var names = new string[] { "Dog", "Cat", "Giraffe", "Monkey", "Tortoise" };
var result =
    from animalName in names
    let nameLength = animalName.Length
    where nameLength > 3
    orderby nameLength
    select animalName; 

উপরের ক্যোয়ারী এক্সপ্রেশনটিতে, letকীওয়ার্ডটি কোনও মান যেখানে ডুপ্লিকেট কল ছাড়াই ও অর্ডারবাই অপারেশনগুলিতে প্রেরণ করার অনুমতি দেয় animalName.Length।

লিনকিউ এক্সটেনশন পদ্ধতি কলগুলির সমতুল্য সেট কী যা এখানে "লেট" কীওয়ার্ডটি অর্জন করে তা অর্জন করে?


11
এফওয়াইআই, সি # 3.0 স্পেসিফিকেশন বিশদ বিবরণে প্রতিটি ক্যোয়ারী বোঝার অনুবাদ নিয়ম ব্যাখ্যা করে detail
— এরিক লিপার্ট

17
এবং যারা অনুমান ভারী চলতে দেখে তাদের জন্য জন স্কিটির সি # ডিপথ এটিকেও কভার করে ;
— মার্ক

সি # ল্যাঙ্গুয়েজ স্পেসিফিকেশনগুলি ডাউনলোডযোগ্য ওয়ার্ড ডকুমেন্টস যার বিষয়বস্তু অনুসন্ধান ইঞ্জিন দ্বারা সূচিযুক্ত নয় এবং এটি লিঙ্কযোগ্য বা অনলাইনে ব্রাউজযোগ্য নয়। স্পেসিফিকেশনগুলি অনলাইনে উপলব্ধ থাকলে এটি একটি দুর্দান্ত সহায়তা হবে।
— অলিভিয়ার জ্যাকট-ডেসকোম্বেস

উত্তর:


249

এর নিজস্ব অপারেশন নেই; এটি পিগি-ব্যাক অফ অফ Select। আপনি যদি কোনও বিদ্যমান ডিএলকে আলাদা করতে "প্রতিবিম্বক" ব্যবহার করেন তবে আপনি এটি দেখতে পাবেন।

এটি এমন কিছু হবে :

var result = names
        .Select(animalName => new { nameLength = animalName.Length, animalName})
        .Where(x=>x.nameLength > 3)
        .OrderBy(x=>x.nameLength)
        .Select(x=>x.animalName);

4
ওহ, আমি জানতাম না যে আপনি নতুন অপারেটরটি ব্যবহার করে এটি স্বয়ংক্রিয়ভাবে ক্যাপসুলেট করতে পারেন।
— ডেভিড ফেফার

19
আপনি যদি কোয়েরিয়েবল দিয়ে শুরু করেন তবে উত্পন্ন কোডটি দেখতে লিনকপ্যাডের ফলাফল ফলকে সামান্য "ল্যাম্বদা" বোতামটিও ব্যবহার করতে পারেন । অন্য কথায়, আপনি যদি নিজের প্রথম লাইনটি var নাম = নতুন স্ট্রিংয়ে পরিবর্তন করেন [] Dog "কুকুর", ...} .আসকিউয়েরিয়েবল (); তারপরে লিনকপ্যাডে পুরো জিনিসটি চালান, ছোট ল্যাম্বডা বোতামটি ক্লিক করুন, আপনি জেনারেট কোডটি মার্কের উত্তরের সাথে কার্যত অভিন্ন দেখতে পাবেন।
— রেব কেবিন

3
.Dump()ফলাফল লাম্বদা দেখতে আমার লিনকপ্যাডে এক্সটেনশন পদ্ধতিটি ব্যবহার করা দরকার ।
— জাস্টানথেরদেব

88

এখানে একটি ভাল নিবন্ধ আছে

মূলত letএকটি বেনামে টিপল তৈরি করে। এটি এর সমতুল্য:

var result = names.Select(
  animal => new { animal = animal, nameLength = animal.Length })
.Where(x => x.nameLength > 3)
.OrderBy(y => y.nameLength)
.Select(z => z.animal);

আমি উপরের নিবন্ধটি উদ্ধৃত করেছিit seems prudent to recommend against using the let keyword in cases where you do not need to transform a variable
— জেবি। মনিকার সাথে।

আমি এটিকে আরও উদ্ধৃতি দিয়েছি:This could be considered a micro-optimisation
— মনসাইনর

7

সিস্টেমে একটি .l এক্সটেনশন পদ্ধতিও রয়েছে nএন্ট্রিএটিভ, তবে এর উদ্দেশ্য একটি সাবলীল অভিব্যক্তিতে 'ইন-লাইন' মূল্যায়নের জন্য ল্যাম্বডা এক্সপ্রেশনটি চালু করা। উদাহরণস্বরূপ, নিম্নলিখিত লিংকটি বিবেচনা করুন (লিনকপ্যাডে, বলুন) প্রতিবার কার্যকর হওয়ার সাথে সাথে এলোমেলো সংখ্যা তৈরি করে:

var seq = EnumerableEx.Generate(
    new Random(),
    _ => true,
    _ => _,
    x => x.Next());

নতুন এলোমেলো নমুনাগুলি প্রতিবার প্রদর্শিত হয় তা দেখতে, নিম্নলিখিতটি বিবেচনা করুন

seq.Zip(seq, Tuple.Create).Take(3).Dump();

যা জোড়া তৈরি করে যেখানে বাম এবং ডান আলাদা। বাম এবং ডান সর্বদা একই থাকে এমন জোড়া তৈরি করতে নীচের মতো কিছু করুন:

seq.Take(3).ToList().Let(xs => xs.Zip(xs, Tuple.Create)).Dump(); 

আমরা সরাসরি লাম্বদা এক্সপ্রেশন প্রার্থনা করতে পারে, আমরা লিখতে পারে

(xs => xs.Zip(xs, Tuple.Create))(seq.Take(3).ToList()).Dump();

তবে আমরা ল্যাম্বডা এক্সপ্রেশনকে অনুরোধ করতে পারি না যেন তারা পদ্ধতি।


1

চেইনেড লিনকিউ এক্সটেনশন পদ্ধতি কলগুলিতে 'লেট' কীওয়ার্ডের সমতুল্য কোড সম্পর্কে

উপরের মন্তব্যটি আর বৈধ নয়

var x = new List<int> { 2, 3, 4, 5, 6 }.AsQueryable();
(from val in x
let val1 = val
let val2 = val + 1
where val2 > val1
select val
).Dump();

উত্পাদন করে

System.Collections.Generic.List`1[System.Int32]
.Select(
  val =>
     new
     {
         val = val,
         val1 = val
     }
)
.Select(
  temp0 =>
     new
     {
         temp0 = temp0,
         val2 = (temp0.val + 1)
     }
)
.Where(temp1 => (temp1.val2 > temp1.temp0.val1))
.Select(temp1 => temp1.temp0.val)

সুতরাং একাধিক letএখন অনুকূলিত হয়

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