যথাযথ লিনক যেখানে ধারা


133

আমি আমার প্রতিদিনের জীবনে মোটামুটি লিনাক লিখি তবে বেশিরভাগ সরল বক্তব্য। আমি লক্ষ করেছি যে যেখানে ক্লজগুলি ব্যবহার করার সময় সেগুলি লেখার অনেকগুলি উপায় রয়েছে এবং আমি যতদূর বলতে পারি তার একই ফলাফল রয়েছে। উদাহরণ স্বরূপ;

from x in Collection
  where x.Age == 10
  where x.Name == "Fido"
  where x.Fat == true
  select x;

কমপক্ষে যতদূর ফলাফল সম্পর্কিত তা এর সমতুল্য বলে মনে হচ্ছে:

from x in Collection
  where x.Age == 10 &&
        x.Name == "Fido" &&
        x.Fat == true
  select x;

তাহলে সিনট্যাক্স বাদে সত্যিই অন্যরকম কিছু আছে? যদি তা হয় তবে পছন্দের স্টাইলটি কী এবং কেন?


203
তোমার বুলিয়ান Fatসম্পত্তি আছে? এটা সরল মানে।
বালা আর

104
@ বালা আর: আরে, আপনার কুকুরটি যদি মোটা হয় তবে আপনার কুকুরটি মোটা।
এআর

উত্তর:


76

দ্বিতীয়টি আরও কার্যকর হবে কারণ এটি সংগ্রহে প্রতিটি আইটেমের বিপরীতে মূল্যায়ন করার জন্য একটি শিকারী রয়েছে যেখানে প্রথমটির মতো এটি প্রথমে সমস্ত আইটেমের জন্য প্রথম শিকারী প্রয়োগ করছে এবং ফলাফল (যা এই সময়ে সঙ্কুচিত) দ্বিতীয় শিকারী ইত্যাদির জন্য ব্যবহৃত। ফলাফলগুলি প্রতিটি পাসে সংকীর্ণ হয় তবে তবুও এতে একাধিক পাস জড়িত।

এছাড়াও চেইনিং (প্রথম পদ্ধতি) কেবলমাত্র তখনই কাজ করবে যদি আপনি আপনার ভবিষ্যদ্বাণীগুলি অ্যান্ডিং করে থাকেন। এরকম কিছু x.Age == 10 || x.Fat == trueআপনার প্রথম পদ্ধতিতে কাজ করবে না।


1
চেইন oring অবস্থার এই এক্সটেনশনটি ব্যবহার কিছুটা সম্ভব: albahari.com/nutshell/predicatebuilder.aspx
jahu

142

সম্পাদনা: লিনক টু অবজেক্টস কীভাবে এটি প্রত্যাশা করে তা আচরণ করে না। আমি সবেমাত্র এই সম্পর্কে লিখেছি ব্লগ পোস্টে আপনি আগ্রহী হতে পারে ...


যা বলা হবে তার দিক থেকে তারা আলাদা - প্রথমটি এর সমতুল্য:

Collection.Where(x => x.Age == 10)
          .Where(x => x.Name == "Fido")
          .Where(x => x.Fat == true)

পরেরটি সমান:

Collection.Where(x => x.Age == 10 && 
                      x.Name == "Fido" &&
                      x.Fat == true)

এখন কি পার্থক্য যা আসলে তা নির্ভর করে Whereডেকে আনা বাস্তবায়নের উপর । যদি এটি কোনও এসকিউএল-ভিত্তিক সরবরাহকারী হয় তবে আমি আশা করব যে দুজন একই এসকিউএল তৈরি করবে। যদি এটি লিনকিউ থেকে অবজেক্টে থাকে তবে দ্বিতীয়টিতে ইন্ডায়ারেশনের কম স্তর থাকবে (সেখানে চারটির পরিবর্তে মাত্র দু'টি পুনরায় জড়িত থাকবেন)। গতির দিক দিয়ে সেই স্তরগুলির ইন্ডিয়ারেশন গুরুত্বপূর্ণ কিনা তা ভিন্ন বিষয়।

সাধারণত আমি বেশ কয়েকটি whereধারা ব্যবহার করি যদি তাদের মনে হয় যে তারা উল্লেখযোগ্যভাবে ভিন্ন ভিন্ন অবস্থার প্রতিনিধিত্ব করছে (উদাহরণস্বরূপ, কোনও বস্তুর এক অংশের সাথে করণীয়, এবং একটি সম্পূর্ণ পৃথক পৃথক) এবং whereযখন বিভিন্ন শর্তগুলি ঘনিষ্ঠভাবে সম্পর্কিত হয় তখন একটি ধারা (যেমন একটি নির্দিষ্ট মান) সর্বনিম্নের চেয়ে বড় এবং সর্বাধিকের চেয়ে কম)। মূলত কোনও সামান্য পারফরম্যান্সের পার্থক্যের আগে এটি পঠনযোগ্যতা বিবেচনা করার মতো।


1
@ জোনস্কিট হয়ত আমি ভুল, কিন্তু লিনকের একটি দ্রুত পর্যালোচনা করার পরে যেখানে বাস্তবায়ন হচ্ছে, আমি সে সম্পর্কে নিশ্চিত নই। নেস্টেড যেখানে স্ট্যাটিক পদ্ধতি 'কম্বাইনপ্রেডিকেটস' দ্বারা মিলিত হয়। সংশ্লেষিত প্রিকেট সহ একক পুনরাবৃত্তিকারী দ্বারা সংগ্রহ একবারে পুনরাবৃত্তি হয়। অবশ্যই, ফানক সংমিশ্রণের কার্যকারিতা প্রভাব রয়েছে, তবে এটি খুব সীমাবদ্ধ। তুমি ঠিক আছ ?
সাইবারম্যাক্সস

@ সাইবারম্যাক্স: ঠিক কী , নিশ্চিত নন ? আমি কখনই সংগ্রহটি একাধিকবার পুনরাবৃত্তি করার পরামর্শ দিইনি।
জন স্কিটি

@ জোনস্কিট হ্যাঁ অবশ্যই তবে শেষের দিকে সমস্ত প্রাকটিকেট একত্রিত হয়েছে এবং কেবলমাত্র একটি পুনরাবৃত্তি চালক। গণনাকারী দেখুন। যেখানেই নির্বাচন করুন গণনাকারী।
সাইবারম্যাক্সস

আপনার লিঙ্ক করা পৃষ্ঠাটি এখন নিচে। নিবন্ধটি অন্য কোথাও যদি থাকে তবে আপনি দয়া করে লিঙ্কটি আপডেট করতে পারবেন? ধন্যবাদ।
আসাদ সাইদুদ্দীন

2
@ আসাদ: আপডেট হয়েছে। (আমার ব্লগ সরে গেছে।)
জন স্কিটি

13

প্রথমটি প্রয়োগ করা হবে:

Collection.Where(x => x.Age == 10)
          .Where(x => x.Name == "Fido") // applied to the result of the previous
          .Where(x => x.Fat == true)    // applied to the result of the previous

অনেক সরল (এবং আরও দ্রুত সম্ভবত দ্রুততর) এর বিপরীতে :

// all in one fell swoop
Collection.Where(x => x.Age == 10 && x.Name == "Fido" && x.Fat == true)

6
"অনেক দ্রুত"? কোন লিনকিউ বাস্তবায়ন এখনও জড়িত তা আমরা জানি না, সুতরাং এর সাথে কোনও কার্য সম্পাদনের বিষয়টি যুক্ত করা শক্ত।
জন স্কেটি

সাধারণ ক্ষেত্রে পরেরটির জন্য কেবল 1 টি লুপ প্রয়োজন। কোনও সরবরাহকারী প্রথম উদাহরণটি সমতল করতে বেছে নিতে পারে তবে এটির প্রয়োজন হয় না।
user7116

2
প্রকৃতপক্ষে ... কিন্তু আপনি আধুনিক দাবি করছি হয় পর্যন্ত দ্রুত। এটি মোটেও পরিষ্কার নয় যে এটি আদৌ উল্লেখযোগ্যভাবে দ্রুত হবে - সর্বোপরি, পারফরম্যান্স পার্থক্যের তাত্পর্য এটি কীভাবে ব্যবহৃত হচ্ছে তার উপর নির্ভর করবে।
জন স্কেটি

1
@ জন: কোন মতবিরোধ নেই। আপনি যেমন লক্ষ করেন যে বাস্তবতা লিনকিউ সরবরাহকারী হতে পারে এবং অভিব্যক্তিতে দরকারী অপ্টিমাইজেশনের রূপান্তরগুলি করে। তবে দ্বিতীয়টি প্রদত্ত শুধুমাত্র একটি লুপ প্রয়োজন এবং বুলিয়ান শর্ট সার্কিট থেকে উপকারিতা, এটি কেন সাধারণ শর্তে "বেশি দ্রুত" হিসাবে লেবেল করা উচিত নয় তা বোঝা শক্ত। যদি ওপিতে কেবল 5 টি উপাদান থাকে তবে আমার পয়েন্টটি মোট হবে।
user7116

11

আমি যখন দৌড়াচ্ছি

from c in Customers
where c.CustomerID == 1
where c.CustomerID == 2
where c.CustomerID == 3
select c

এবং

from c in Customers
where c.CustomerID == 1 &&
c.CustomerID == 2 &&
c.CustomerID == 3
select c customer table in linqpad

আমার গ্রাহক টেবিলের বিপরীতে এটি একই স্কেল কোয়েরি আউটপুট দেয়

-- Region Parameters
DECLARE @p0 Int = 1
DECLARE @p1 Int = 2
DECLARE @p2 Int = 3
-- EndRegion
SELECT [t0].[CustomerID], [t0].[CustomerName]
FROM [Customers] AS [t0]
WHERE ([t0].[CustomerID] = @p0) AND ([t0].[CustomerID] = @p1) AND ([t0].[CustomerID] = @p2)

সুতরাং স্ক্যুলে অনুবাদ করার ক্ষেত্রে কোনও পার্থক্য নেই এবং আপনি ইতিমধ্যে অন্যান্য উত্তরগুলিতে দেখেছেন যে সেগুলি কীভাবে ল্যাম্বডা অভিব্যক্তিতে রূপান্তরিত হবে?


ঠিক আছে, তাহলে আপনি বলতে চান যে আমি যদি এর কোনটি ব্যবহার করি তবে এর কোনও কার্যকারিতা প্রভাব ফেলবে না?
বিমল দাস

যেখানে ক্লজ আসলে জড়িত। সুতরাং, আপনি এটি কীভাবে লিখেন তা বিবেচ্য নয়। পারফরম্যান্সের কোনও পার্থক্য নেই।

3

ফণা নীচে খুঁজছেন, দুটি বিবৃতি বিভিন্ন প্রশ্নের উপস্থাপনা রূপান্তর করা হবে। উপর নির্ভর করে QueryProviderএর Collection, এই দূরে অপ্টিমাইজ করা যেতে পারে বা না।

যখন এটি একটি লিনাক-টু-অবজেক্ট কল হয়, একাধিক যেখানে ক্লজগুলি একে অপরের থেকে পড়া আইনুমেবলগুলির একটি শৃঙ্খলে নিয়ে যায়। সিঙ্গল-ক্লজ ফর্মটি ব্যবহার করা এখানে পারফরম্যান্সে সহায়তা করবে।

অন্তর্নিহিত সরবরাহকারী যখন এটি এসকিউএল বিবৃতিতে অনুবাদ করেন, সম্ভাবনা ভাল হয় যে উভয় রূপ একই স্টেটমেন্ট তৈরি করবে।

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