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


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.