আর কোনও উত্তর যুক্ত করতে কি খুব দেরি হচ্ছে?
আমি লিনকিউ-টু-অবজেক্টস কোডের এক টন লিখেছি এবং আমি দাবি করি যে কমপক্ষে সেই ডোমেনে যে দুটি কোডের বাক্যকে বোঝার পক্ষে সহজ কোডের জন্য যে কোনওটি তৈরি করে - যা সর্বদা বিন্দু-বাক্য গঠন নয়।
অবশ্যই এমন সময় আসে যখন ডট সিনট্যাক্স হয় IS যেতে উপায় - অন্যদের এইসব ক্ষেত্রে বিভিন্ন প্রদান করে; তবে আমি মনে করি বোঝাপড়াগুলি সংক্ষিপ্ত-পরিবর্তিত হয়েছে - যদি আপনি চান তবে একটি খারাপ রেপ দেওয়া হয়েছে। সুতরাং আমি একটি নমুনা সরবরাহ করব যেখানে আমি বিশ্বাস করি যে বোধগম্যতা কার্যকর।
এখানে একটি ডিজিটাল প্রতিস্থাপন ধাঁধাটির সমাধান: (লিনিকপ্যাড ব্যবহার করে লিখিত সমাধান, তবে কনসোল অ্যাপ্লিকেশনটিতে একা দাঁড়িয়ে থাকতে পারে)
// NO
// NO
// NO
//+NO
//===
// OK
var solutions =
from O in Enumerable.Range(1, 8) // 1-9
//.AsQueryable()
from N in Enumerable.Range(1, 8) // 1-9
where O != N
let NO = 10 * N + O
let product = 4 * NO
where product < 100
let K = product % 10
where K != O && K != N && product / 10 == O
select new { N, O, K };
foreach(var i in solutions)
{
Console.WriteLine("N = {0}, O = {1}, K = {2}", i.N, i.O, i.K);
}
//Console.WriteLine("\nsolution expression tree\n" + solutions.Expression);
... যা ফলাফল:
এন = 1, ও = 6, কে = 4
খুব খারাপ নয়, যুক্তিটি সুস্পষ্টভাবে প্রবাহিত হয় এবং আমরা দেখতে পাই যে এটি একটি একক সঠিক সমাধান নিয়ে আসে। এই ধাঁধাটি হাত দ্বারা সমাধান করার পক্ষে যথেষ্ট সহজ: 3>> N
0, এবং O
> 4 * N এর দ্বারা 8> = O
> = 4 বোঝানো হয়েছে hand এর অর্থ হাতে হাতে পরীক্ষার জন্য সর্বোচ্চ 10 টি মামলা রয়েছে ( N
2--5- এর জন্য 2 O
)। আমি যথেষ্ট বিপথগামী - এই ধাঁধাটি LINQ চিত্রের উদ্দেশ্যে দেওয়া হয়েছে purposes
সংকলক রূপান্তর
সংকলক এর সমতুল্য বিন্দু-বাক্য বিন্যাসে অনুবাদ করতে অনেক কিছুই করে। সাধারণ দ্বিতীয় এবং পরবর্তী from
ধারাগুলি SelectMany
কলগুলিতে রূপান্তরিত হওয়ার পাশাপাশি আমাদের এমন let
ধারা Select
রয়েছে যা অনুমানের সাথে কল হয়ে যায় , উভয়ই স্বচ্ছ-শনাক্তকারী ব্যবহার করে । আমি যেমন প্রদর্শন করতে চলেছি, বিন্দু বাক্য গঠনতে এই সনাক্তকারীদের নামকরণ করা সেই পদ্ধতির পাঠযোগ্যতার থেকে দূরে সরে যায়।
এই কোডটি বিন্দু বিন্যাসে অনুবাদ করার ক্ষেত্রে সংকলকটি কী করে তা প্রকাশ করার জন্য আমার একটি কৌশল আছে। যদি আপনি উপরে দুটি মন্তব্য করা লাইনটিকে আপত্তিহীন করেন এবং এটি আবার চালান, আপনি নিম্নলিখিত আউটপুট পাবেন:
এন = 1, ও = 6, কে = 4
সমাধান এক্সপ্রেশন ট্রি সিস্টেম.লিনক.ইনিমিউরেবল + ডি_বি 8.স্লেকটম্যানি (ও => রেঞ্জ (1, 8), (ও, এন) => নতুন <> চ _ অজ্ঞাতনামা টাইপ 2(O = O, N = N)).Where(<>h__TransparentIdentifier0 => (<>h__TransparentIdentifier0.O != <>h__TransparentIdentifier0.N)).Select(<>h__TransparentIdentifier0 => new <>f__AnonymousType1
2 (<> h_ স্বচ্ছ আইডেন্টিফায়ার 0 = <> এইচ_ট্রান্সপারেন্ট আইডেন্টিফায়ার 0, কোন = ((10 * <> h_ স্বচ্ছ আইডেন্টিফায়ার 0. এন )) + <> এইচ_ট্রান্সপারেন্টআইডেন্টিফায়ার 0.O))) নির্বাচন করুন (<> এইচ_ ট্রান্সপারেন্টআইডেন্টিফায়ার 1 => নতুন <> চ _ অজ্ঞাতনামা টাইপ 2(<>h__TransparentIdentifier1 = <>h__TransparentIdentifier1, product = (4 * <>h__TransparentIdentifier1.NO))).Where(<>h__TransparentIdentifier2 => (<>h__TransparentIdentifier2.product < 100)).Select(<>h__TransparentIdentifier2 => new <>f__AnonymousType3
2 2 (<> h_ স্বচ্ছ আইডেন্টিফায়ার 2 = <h h_ Transp2_d <> h_ স্বচ্ছ আইডেন্টিফায়ার 2. প্রোডাক্ট % 10%))) যেখানে (<> এইচ_প্রসারণকারী পরিচয়কারী 3 => (((<<h_ TranspantIdentifier3.K ! = <> h_ ট্রান্সপারেন্টআইডেন্টিফায়ার 3) <<< h_ স্বচ্ছ আইডেন্টিফায়ার 2। <>এইচ_ট্রান্সপারেন্ট আইডেন্টিফায়ার 1। <> এইচ_TransparentIdentifier0.O) AndAlso (<> জ _TransparentIdentifier3.K! = <> H_ TransparentIdentifier3। <> জ _TransparentIdentifier2। <> H_ TransparentIdentifier1। <> জ _TransparentIdentifier0.N)) AndAlso ((<> h_ TransparentIdentifier3। <> জ _TransparentIdentifier2। পণ্য / 10) == <> h_ TransparentIdentifier3। <> জ _TransparentIdentifier2। <> h_ TransparentIdentifier1। <> জ _TransparentIdentifier0.O)))। নির্বাচন করুন (<> h_ TransparentIdentifier3 => নতুন <> চ _AnonymousType4`3 (এন = < > h_ TransparentIdentifier3। <> জ _TransparentIdentifier2। <> h_ TransparentIdentifier1। <> জ _TransparentIdentifier0.N,ও = <> এইচ_ স্বচ্ছ আইডেন্টিফায়ার 3। <> এইচট্রান্সপারেন্ট আইডেন্টিফায়ার 2। <> এইচ_ট্রান্সপারেন্টআইডেন্টিফায়ার 1। <> এইচ_ট্রান্সপারেন্টআইডেন্টিফায়ার 0.O, কে = <> h__ ট্রান্সপারেন্টআইডেন্টিফায়ার 3. কে))
প্রতিটি লিনকিউ অপারেটরকে একটি নতুন লাইনে রেখে, আমরা "কথা বলতে" পারছি না এমনগুলিতে "অবর্ণনীয়" সনাক্তকারীকে অনুবাদ করে, বেনামি প্রকারগুলিকে তাদের পরিচিত ফর্মের সাথে পরিবর্তন করে এবং AndAlso
সংমিশ্রণে &&
সংকলক যে রূপান্তরটি প্রকাশ করে তা প্রকাশ করতে এক্সপ্রেশন-ট্রি লিঙ্গো পরিবর্তন করে বিন্দু বাক্য গঠন:
var solutions =
Enumerable.Range(1,8) // from O in Enumerable.Range(1,8)
.SelectMany(O => Enumerable.Range(1, 8), (O, N) => new { O = O, N = N }) // from N in Enumerable.Range(1,8)
.Where(temp0 => temp0.O != temp0.N) // where O != N
.Select(temp0 => new { temp0 = temp0, NO = 10 * temp0.N + temp0.O }) // let NO = 10 * N + O
.Select(temp1 => new { temp1 = temp1, product = 4 * temp1.NO }) // let product = 4 * NO
.Where(temp2 => temp2.product < 100) // where product < 100
.Select(temp2 => new { temp2 = temp2, K = temp2.product % 10 }) // let K = product % 10
.Where(temp3 => temp3.K != temp3.temp2.temp1.temp0.O && temp3.K != temp3.temp2.temp1.temp0.N && temp3.temp2.product / 10 == temp3.temp2.temp1.temp0.O)
// where K != O && K != N && product / 10 == O
.Select(temp3 => new { N = temp3.temp2.temp1.temp0.N, O = temp3.temp2.temp1.temp0.O, K = temp3.K });
// select new { N, O, K };
foreach(var i in solutions)
{
Console.WriteLine("N = {0}, O = {1}, K = {2}", i.N, i.O, i.K);
}
আপনি যদি চালনা করেন তবে যাচাই করতে পারবেন যে এটি আবার আউটপুট রয়েছে:
এন = 1, ও = 6, কে = 4
... তবে আপনি কি কখনও এই জাতীয় কোড লিখবেন?
আমি উত্তরটি হ'ব ননবিবিএন (কেবলমাত্র নয়, তবে হেল নো!) - কারণ এটি কেবল খুব জটিল। নিশ্চিত যে আপনি "টেম্পেল" .. "টেম্প3" এর চেয়ে আরও কিছু অর্থবহ শনাক্তকারী নাম নিয়ে আসতে পারেন, তবে মূল বিষয়টি হ'ল তারা কোডটিতে কোনও কিছু যোগ করেন না - তারা কোডটি আরও ভাল সম্পাদন করে না, তারা করে না কোডটি আরও ভালভাবে পড়তে পারেন, তারা কোডটি কেবল কুৎসিত করে তুলেছে এবং আপনি যদি হাতের সাহায্যে এটি করছিলেন তবে কোনও সন্দেহ নেই যে আপনি এটি সঠিক হওয়ার আগে একবার বা তিনবার বেঁধে ফেলবেন। এছাড়াও, অর্থের শনাক্তকারীদের জন্য "নেম গেম" খেলাই যথেষ্ট শক্ত, তাই সংকলক আমাকে কোয়েরি বোধগম্যতার জন্য প্রস্তুতকৃত নাম-গেমটি থেকে বিরতিকে স্বাগত জানাই।
এই ধাঁধার নমুনা আপনার পক্ষে গুরুত্ব সহকারে নেওয়ার পক্ষে যথেষ্ট বাস্তব-জগতের নাও হতে পারে ; যাইহোক, অন্যান্য পরিস্থিতি উপস্থিত রয়েছে যেখানে ক্যোয়ারী অনুধাবনগুলি আলোকিত হয়:
- এর জটিলতা
Join
এবং GroupJoin
: ক্যোয়ারী বোধগম্য শর্তাদি মধ্যে পরিসীমা ভেরিয়েবলগুলির স্কোপিং join
এমন ভুলগুলি ঘুরিয়ে দেয় যা অন্যথায় ডট-সিনট্যাক্সে সংযোজন সিনট্যাক্সের সংকলন-সময় ত্রুটিতে সংকলন করতে পারে।
- সংকলক যেকোন সময় বোঝা রূপান্তরে স্বচ্ছ-শনাক্তকারী পরিচয় করিয়ে দেবে, বোধগম্যতা সার্থক হয়ে উঠবে।
from
এটিতে নিম্নলিখিতগুলির যে কোনওটির ব্যবহার অন্তর্ভুক্ত রয়েছে: একাধিক ধারা, join
& join..into
ধারা এবং let
ধারাগুলি।
আমি আমার শহরে একাধিক ইঞ্জিনিয়ারিং শপ সম্পর্কে জানি যা অনুধাবন সিনট্যাক্সকে নিষিদ্ধ করেছে । আমি মনে করি এটি অনুবেদনা হিসাবে বোঝা বাক্য গঠন যা কেবল একটি সরঞ্জাম এবং সেটিতে একটি দরকারী। আমার মনে হয় এটি অনেকটা বলার মতো, "এমন কিছু জিনিস রয়েছে যা আপনি একটি ছাতা দিয়ে করতে পারবেন না এমন একটি স্ক্রু ড্রাইভার দিয়ে করতে পারেন Because