একটি আইটেম নির্বাচন করার জন্য লিনক কোড


105

আমি মেলে এমন একটি আইটেম নির্বাচন করতে নিজেকে এই জাতীয় প্রচুর কোড লিখতে দেখি

var item = (from x in Items where x.Id == 123 select x).First();

এটি করার একটি পরিষ্কার উপায় আছে বা এটি আমি পেতে চলেছি হিসাবে সংক্ষিপ্ত হয়?

সম্পাদনা: "লিঙ্ক সিনট্যাক্স ব্যবহারের ক্লিনার উপায়" বলা উচিত ছিল। আমি ল্যাম্বডা সিনট্যাক্স সম্পর্কে ইতিমধ্যে অবগত ছিলাম এবং এটি দেখতে এটি দেখতে কেবলমাত্র একমাত্র উপায়। যদিও আমি কিছু দরকারী তথ্য পেয়েছি, সুতরাং যারা প্রত্যুত্তর করেছে তাদের সবাইকে ধন্যবাদ।


5
ব্যক্তিগতভাবে আমি এড়ানো Single()এবং SingleOrDefault()যদি আমি জানি যে ডেটা ইতিমধ্যে স্বতন্ত্র (উদাহরণস্বরূপ একটি ডাটাবেস থেকে যে সীমাবদ্ধতা ইত্যাদি রয়েছে), যেহেতু Single()সম্ভাব্য সদৃশ সন্ধানের জন্য এটি বাকী তালিকাকে স্ক্যান করতে বাধ্য করে, তবে তা আমিই। এই মুহুর্তে আপনার স্বতন্ত্রতা প্রয়োগ করার প্রয়োজন Single()হলে পরিবার ব্যবহার করুন , যদি না হয় তবে First()পরিবারটি ব্যবহার করুন ।
জেমস মাইকেল হরে

উত্তর:


176

আপনি লিনক ক্যোয়ারী সিনট্যাক্সটি কতটা পছন্দ তা নির্ভর করে, আপনি সরাসরি এক্সটেনশন পদ্ধতিগুলি ব্যবহার করতে পারেন:

var item = Items.First(i => i.Id == 123);

এবং যদি তালিকাটি খালি থাকে তবে আপনি কোনও ত্রুটি ছুঁড়তে না চান, FirstOrDefaultযা উপাদান ধরণের ( nullরেফারেন্স ধরণের জন্য) জন্য ডিফল্ট মান দেয় তা ব্যবহার করুন :

var item = Items.FirstOrDefault(i => i.Id == 123);

if (item != null)
{
    // found it
}

Single()এবং SingleOrDefault()এটি ব্যবহার করা যেতে পারে, তবে আপনি যদি কোনও ডাটাবেস বা কিছু ইতিমধ্যে স্বতন্ত্রতার গ্যারান্টি থেকে পড়তে থাকেন তবে আমি কোনও উদ্বেগ এবং নিক্ষেপ আছে কিনা তা দেখার জন্য তালিকাটি স্ক্যান করতে হবে বলে আমি বিরক্ত করব না। First()এবং FirstOrDefault()প্রথম ম্যাচে থামুন, তাই তারা আরও দক্ষ।

এর First()এবং Single()পরিবার, এখানে যেখানে তারা নিক্ষেপ:

  • First() - ফাঁকা থাকলে / খুঁজে পাওয়া যায় না, নকল হলে ছুঁড়ে না
  • FirstOrDefault() - খালি / পাওয়া না গেলে ডিফল্ট ফিরিয়ে দেয়, সদৃশ হলে নিক্ষেপ করবে না
  • Single() - খালি / পাওয়া না গেলে নিক্ষেপ করে, নকল উপস্থিত থাকলে ছোঁড়ে
  • SingleOrDefault() - খালি / পাওয়া না গেলে ডিফল্ট ফিরিয়ে দেয়, সদৃশ উপস্থিত থাকলে নিক্ষেপ করে

1
আমি মনে করি আপনি সেখানে দুটি সমান চিহ্ন নিখোঁজ রয়েছেন। হওয়া উচিতi.Id == 123
davehale23

18

আপনার দৃশ্যের উপর নির্ভর করে এবং আপনি সেখানে শূন্য বা একাধিক ম্যাচ হ্যান্ডেল করতে চান কিনা তা বিবেচনা করে ফার্স্টঅরডিফল্ট বা সিঙ্গলঅরডিফল্ট কার্যকর হতে পারে:

ফার্স্টআরডিফল্ট: অনুক্রমের প্রথম উপাদান বা কোনও উপাদান না পাওয়া গেলে একটি ডিফল্ট মান প্রদান করে।

সিঙ্গলঅরডিফল্ট: সিকোয়েন্সের একমাত্র উপাদান বা সিকোয়েন্সটি ফাঁকা থাকলে একটি ডিফল্ট মান প্রদান করে; অনুক্রমের একাধিক উপাদান থাকলে এই পদ্ধতিটি একটি ব্যতিক্রম ছুঁড়ে দেয়

আমি জানি না যে এটি কীভাবে 'প্রশ্ন' থেকে একটি লিনাকে কাজ করে তবে ল্যাম্বদা সিনট্যাক্সে এটি দেখতে এটির মতো দেখাচ্ছে:

var item1 = Items.FirstOrDefault(x => x.Id == 123);
var item2 = Items.SingleOrDefault(x => x.Id == 123);

ডিবি সময়ে সবচেয়ে কার্যকর কোনটি? আমার যদি একটি ভারচার থাকে তবে আমি একটি সঠিক ম্যাচ চাইতাম তবে কোনওটিই সম্ভব ছিল না?
পাইটর কুলা

2
পূর্ণ গৃহীত উত্তর ঠিকানাগুলি এই, কিন্তু মূলত FirstOrDefault যত তাড়াতাড়ি এটা একটি ম্যাচ খুঁজে বের করে বন্ধ হয়ে যায়, কিন্তু SingleOrDefault পুরো তালিকা নিশ্চিত করার নেই পরীক্ষা আবশ্যক ঠিক একটি ম্যাচ।
স্টুয়ার্ট

12

এই পছন্দসই পদ্ধতি:

var item = Items.SingleOrDefault(x => x.Id == 123);

অথবা

var item = Items.Single(x => x.Id == 123);

ধন্যবাদ - সুতরাং এই পরিস্থিতিতে কোনও লিঙ্ক স্বরলিপি নেই এবং আমার ল্যাম্বডাস ব্যবহার করা দরকার?
মিকি হোগার্থ

বেশ ভালো. আমি সত্যিই লিনক অনেক ব্যবহার করি নি, তাই আমি নিশ্চিত না যে আমি এই পদ্ধতিগুলি সম্পর্কে অবগত ছিলাম।
ওয়েজওহে

1
একক পদ্ধতি পরীক্ষা করে দেখায় যে রিটার্নের মানটি অনন্য। সুতরাং আপনার সংগ্রহ বড় হলে এটি অনেক সময় নিতে পারে। প্রথম পদ্ধতিটি কেবল প্রাক্টিকেটের সাথে মেলে এমন প্রথম উপাদানটি প্রদান করে।
meziantou

@ ওয়াওঘে জেমস এর উত্তর লিনাক ব্যবহার করে না - একক এবং একক ওড়ডাফল্ট পদ্ধতিগুলি মূলনীয় বাস্তবায়নের অংশ।
মিকি হোগার্থ

12

কারও জীবন সহজ করার জন্য ল্যাম্বডা এক্সপ্রেশন সহ লিংক কোয়েরি

(from x in Items where x.Id == 123 select x).FirstOrDefault();

এর সাথে একটি এসকিউএল ক্যোয়ারী তৈরি select top (1)করে।


9

এটি আরও ভালভাবে এটি ঘনীভূত করা যেতে পারে।

var item = Items.First(x => x.Id == 123);

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

সিঙ্গল / সিঙ্গেলঅর ডিফল্ট সার্থক তবে কেবল আপনি যদি পুরো সংগ্রহটি পুনরাবৃত্তি করতে চান এবং সেই ম্যাচটি নির্বাচন করার পাশাপাশি ম্যাচটি অনন্য কিনা তা যাচাই করতে চান। প্রথম / ফার্স্টআরডিফল্ট কেবল প্রথম ম্যাচটি নিয়ে চলে যাবে এবং প্রকৃতপক্ষে কয়টি সদৃশ রয়েছে তা নির্বিশেষে leave


4

আপনি এক্সটেনশন পদ্ধতি সিনট্যাক্স ব্যবহার করতে পারেন:

var item = Items.Select(x => x.Id == 123).FirstOrDefault();

তা ছাড়া, আপনার নিজের বিশেষায়িত "ফার্স্ট" এবং "ফার্স্টআরডিফল্ট" এক্সটেনশন পদ্ধতিগুলি না লিখে আপনি আরও সংক্ষিপ্ততা পেতে পারেন তা আমি নিশ্চিত নই।


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

সম্ভবত আপনি এর Whereবিপরীতে বলতে চাইছেন Select, যা ইতিমধ্যে বলা হয়েছে, তবে এই উত্তরটি ভুল। সি # তে নির্বাচন করুন ফলাফলগুলিকে আইউনামেবল <বিউল> এ পরিবর্তন করুন, যাতে আপনি boolপ্রথম আইটেমটির জন্য একটি পেয়ে x.Id == 123
যাচ্ছেন

2

আমার জন্য কী কাজ করেছে তা আমি আপনাকে জানাব:

int id = int.Parse(insertItem.OwnerTableView.DataKeyValues[insertItem.ItemIndex]["id_usuario"].ToString());

var query = user.First(x => x.id_usuario == id);
tbUsername.Text = query.username;
tbEmail.Text = query.email;
tbPassword.Text = query.password;

আমার আইডিটি সেই সারিটি যা আমি জিজ্ঞাসা করতে চাই, এক্ষেত্রে আমি এটি একটি রেডগ্রিড থেকে পেয়েছি, তারপরে আমি এটি ব্যবহার করে জিজ্ঞাসা করেছি, কিন্তু এই ক্যোয়ারীটি একটি সারি দেয়, তারপরে আপনি কোয়েরি থেকে প্রাপ্ত পাঠ্যবক্স বা অন্য কোনও কিছুর মান নির্ধারণ করতে পারেন you , আমি তাদের পাঠ্যবক্সে নিয়োগ করতে হয়েছিল।

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