লিনকু দ্বারা তালিকায় একটি আইটেম সন্ধান করবেন?


226

স্ট্রিংয়ের তালিকায় একটি আইটেম সন্ধান করার জন্য এখানে আমার একটি সাধারণ উদাহরণ রয়েছে। এটি সাধারণত এটির জন্য আমি লুপ বা বেনামে প্রতিনিধিদের জন্য ব্যবহার করি:

int GetItemIndex(string search)
{
   int found = -1;
   if ( _list != null )
   {
     foreach (string item in _list) // _list is an instance of List<string>
     { 
        found++;
        if ( string.Equals(search, item) )
        {
           break;
        }
      }
      /* use anonymous delegate
      string foundItem = _list.Find( delegate(string item) {
         found++;
         return string.Equals(search, item);
      });
      */
   }
   return found;
}

লিনকিউ আমার জন্য নতুন। আমি কি আগ্রহী যদি আমি তালিকাতে আইটেমটি খুঁজতে লিনকিউ ব্যবহার করতে পারি? কীভাবে সম্ভব হলে?


দারুণ. যাইহোক, সেগুলি সমস্ত লামদা এক্সপ্রেশন স্টাইল। আমি এখানে একটি সাধারণ তালিকা ব্যবহার করি। তালিকাটি বেশ কয়েকটি বৈশিষ্ট্য সহ একটি শ্রেণি হতে পারে এবং কিছু অনুসন্ধানের জন্য ব্যবহৃত হয়। সুতরাং "যেখান থেকে ... কোথায় ... নির্বাচন করুন ..." এর মতো কোনও লিংক উপায় অনুসন্ধান করুন
ডেভিড.চু.সিএ

নাহ, দুঃখিত। এই পদ্ধতিগুলির বেশিরভাগ (প্রথম, একক, যে কোনও ...) সরাসরি সেই ফর্মটিতে অনুবাদ করা যায় না।
আর মার্টিনহো ফার্নান্দিস

কিছুই নয়, আসলে আপনি কয়েকটি ক্ষেত্রে ল্যাম্বডাস থেকে মুক্তি পেতে পারেন ...
আর মার্টিনহো ফার্নান্দিস

দুর্দান্ত উত্তর! আমি কেবল গণনার কেস থেকে লিনকিউ অনুসন্ধানের স্বাদ পেতে চাই।
ডেভিড.চু.সি.এ

উত্তর:


478

কয়েকটি উপায় (নোট এই হয় না একটি সম্পূর্ণ তালিকা)।

1) একক একক ফলাফল ফেরত দেবে, তবে এটির ব্যতিক্রম একটি বা একের বেশি না পেলে (যা আপনি চান তা হতে পারে বা নাও পারে):

string search = "lookforme";
List<string> myList = new List<string>();
string result = myList.Single(s => s == search);

নোটটি SingleOrDefault()একই আচরণ করবে, রেফারেন্স প্রকারের জন্য বা ব্যতিক্রম ছোঁড়ার পরিবর্তে মান ধরণের জন্য ডিফল্ট মানটি ফিরে আসার ব্যতীত Note

2) আপনার মানদণ্ডের সাথে মেলে এমন সমস্ত আইটেম কোথায় ফিরে আসবে, যাতে আপনি একটি উপাদান দিয়ে একটি প্রাথমিক সংখ্যা পেতে পারেন:

IEnumerable<string> results = myList.Where(s => s == search);

3) প্রথমটি আপনার আইনের সাথে মেলে যা প্রথম আইটেমটি ফিরিয়ে দেবে:

string result = myList.First(s => s == search);

নোটটি FirstOrDefault()একই আচরণ করবে, রেফারেন্স প্রকারের জন্য বা ব্যতিক্রম ছোঁড়ার পরিবর্তে মান ধরণের জন্য ডিফল্ট মানটি ফিরে আসার ব্যতীত Note


35
দুর্দান্ত উত্তর। আমি সিঙ্গেলঅরডিফল্টকে আমার পছন্দের উত্তর হিসাবে খুঁজে পেয়েছি - সিঙ্গেলের মতো একই তবে এটি যদি খুঁজে না পায় তবে 'নাল' দেয়।
এডি পার্কার

2
আমি সিঙ্গেল () বা সিঙ্গেলঅরডিফল্ট () কেও জানতাম না। খুব দরকারী.
draconis

এই পদ্ধতিগুলি কি অন্য সংগ্রহগুলির মতো খুব বেশি ReadOnlyCollectionবা ব্যবহার করা যেতে পারে ObservableCollection?
yellavon

@ ইয়েলভন এগুলি যে কোনও প্রকার প্রয়োগ করে IEnumerable<T>বা এক্সটেনশন পদ্ধতিগুলি হয়IQueryable<T>
রেক্স এম

4
সিঙ্গেলঅরডিফল্ট ব্যবহার সম্পর্কে একটি বিষয় লক্ষণীয় হ'ল তালিকায় যদি একাধিক ম্যাচ থাকে তবে এটি ব্যতিক্রম ছুঁড়ে দেয়, এটি প্রতিটি আইটেমের মাধ্যমে পুনরাবৃত্তি করতে হবে, যেখানে ফার্স্টআরডেফল্ট প্রথম ম্যাচটি সন্ধানের পরে অনুসন্ধান বন্ধ করবে। এমএসডিএন.মাইক্রোসফট.এইন.উস
লিবারি

73

আপনি যদি উপাদানটির সূচি চান, এটি এটি করবে:

int index = list.Select((item, i) => new { Item = item, Index = i })
                .First(x => x.Item == search).Index;

// or
var tagged = list.Select((item, i) => new { Item = item, Index = i });
int index = (from pair in tagged
            where pair.Item == search
            select pair.Index).First();

আপনি প্রথম পাসে ল্যাম্বডা থেকে মুক্তি পেতে পারবেন না।

নোট করুন যে আইটেমটির অস্তিত্ব না থাকলে এটি নিক্ষেপ করবে। এটি নালাগুলি ইনটগুলি অবলম্বন করে সমস্যার সমাধান করে:

var tagged = list.Select((item, i) => new { Item = item, Index = (int?)i });
int? index = (from pair in tagged
            where pair.Item == search
            select pair.Index).FirstOrDefault();

আপনি যদি আইটেমটি চান:

// Throws if not found
var item = list.First(item => item == search);
// or
var item = (from item in list
            where item == search
            select item).First();

// Null if not found
var item = list.FirstOrDefault(item => item == search);
// or
var item = (from item in list
            where item == search
            select item).FirstOrDefault();

আপনি যদি মেলে এমন আইটেমের সংখ্যা গণনা করতে চান:

int count = list.Count(item => item == search);
// or
int count = (from item in list
            where item == search
            select item).Count();

আপনি যদি মেলে এমন সমস্ত আইটেম চান:

var items = list.Where(item => item == search);
// or
var items = from item in list
            where item == search
            select item;

এবং nullএই ক্ষেত্রে যে কোনও একটির জন্য তালিকাটি পরীক্ষা করতে ভুলবেন না ।

বা এর (list ?? Enumerable.Empty<string>())পরিবর্তে ব্যবহার করুন list

মন্তব্যগুলিতে সহায়তা করার জন্য পাভেলকে ধন্যবাদ।


2
দুটি বিন্দু. প্রথমত, string.Equalsএখানে ব্যবহার করার কোন আসল প্রয়োজন নেই - এতে কোনও ভুল নেই ==। দ্বিতীয়ত, আমিও উল্লেখ করেছি FirstOrDefault(যেসব ক্ষেত্রে আইটেমটি নাও থাকতে পারে), এবং Selectসূচি সহ সেই বিষয়টি কভার করতে যেখানে আইটেমের সূচকের প্রয়োজন হয় (যেমন এটি নিজেই প্রশ্নের নমুনায় রয়েছে)।
পাভেল মিনায়েভ

আমি এখনও খুশি নই। আমার উদাহরণে কোনও -1 সূচক নেই (পাওয়া যায় নি)। যেকোনো পরামর্শ?
আর মার্টিনহো ফার্নান্দিস

প্রথমটির সাথে যদি এটির দূরত্ব পরীক্ষা করা হয় checking
আর মার্টিনহো ফার্নান্দিস

তালিকাটি প্রথমে শূন্য কিনা তা কি আমাকে যাচাই করা উচিত?
ডেভিড.চু.সি.এ

ArgumentNullExceptionউত্সটি শূন্য হলে ছোঁড়া নির্বাচন করুন
আর মার্টিনহো ফার্নান্দিস

13

এটি যদি সত্যিই আপনার হয় তবে List<string>আপনাকে লিনিক্যু দরকার হয় না, কেবল ব্যবহার করুন:

int GetItemIndex(string search)
{
    return _list == null ? -1 : _list.IndexOf(search);
}

আপনি যদি আইটেমটি নিজেই সন্ধান করছেন তবে চেষ্টা করুন:

string GetItem(string search)
{
    return _list == null ? null : _list.FirstOrDefault(s => s.Equals(search));
}

1
প্রথম উদাহরণটির যুক্তি অনুসরণ করে, আমরা _list.Find(search)দ্বিতীয়টির জন্য ব্যবহার করতে পারি ।
jwg

12

আপনি কি তালিকার আইটেমটি চান বা আসল আইটেমটি নিজেই চান (আইটেমটি নিজেই ধরে নিবেন)।

এখানে আপনার জন্য বিকল্পগুলির একটি গুচ্ছ দেওয়া হল:

string result = _list.First(s => s == search);

string result = (from s in _list
                 where s == search
                 select s).Single();

string result = _list.Find(search);

int result = _list.IndexOf(search);

ওহো ... কিছু লোক অতি দ্রুত একটি ট্রিগার;)
কেলসি

ফেরত মূল্য হিসাবে সূচক সম্পর্কে কীভাবে?
ডেভিড.চু.সি.এ

এবং আমার কি _ তালিকাগুলি থেকে _লিস্টে .. রুপে শূন্য আছে কিনা তা খতিয়ে দেখা দরকার?
ডেভিড.চু.সি.এ

6

এই পদ্ধতিটি সহজ এবং নিরাপদ

var lOrders = new List<string>();

bool insertOrderNew = lOrders.Find(r => r == "1234") == null ? true : false


1
আমি মনে করি আমাদেরও true : falseনীচের প্রয়োজন নেই একই কাজ করা উচিত bool insertOrderNew = lOrders.Find(r => r == "1234") == null;
ভিবিপি

5

কীভাবে IndexOf?

নির্দিষ্ট বস্তুর সন্ধান করে এবং তালিকার মধ্যে প্রথম উপস্থিতির সূচকটি প্রদান করে

উদাহরণ স্বরূপ

> var boys = new List<string>{"Harry", "Ron", "Neville"};  
> boys.IndexOf("Neville")  
2
> boys[2] == "Neville"
True

মনে রাখবেন যে তালিকায় মানটি না উপস্থিত হলে এটি -1 প্রদান করে

> boys.IndexOf("Hermione")  
-1

2

আমি একটি অভিধান ব্যবহার করতাম যা কিছু সূচিবদ্ধ তালিকার মতো যা আমাকে যখন চাই আমি ঠিক কী দিতে চাই।

Dictionary<string, int> margins = new Dictionary<string, int>();
margins.Add("left", 10);
margins.Add("right", 10);
margins.Add("top", 20);
margins.Add("bottom", 30);

যখনই আমি আমার মার্জিন মানগুলিতে অ্যাক্সেস করতে চাই, উদাহরণস্বরূপ, আমি আমার অভিধানটি সম্বোধন করি:

int xStartPos = margins["left"];
int xLimitPos = margins["right"];
int yStartPos = margins["top"];
int yLimitPos = margins["bottom"];

সুতরাং, আপনি কী করছেন তার উপর নির্ভর করে একটি অভিধান কার্যকর হতে পারে।


একটি পৃথক প্রশ্নের দুর্দান্ত উত্তর।
jwg

2

আপনার লাইনকিউ ব্যবহারের পদ্ধতিটি পুনরায় লেখার একটি উপায় এখানে রয়েছে:

public static int GetItemIndex(string search)
{
    List<string> _list = new List<string>() { "one", "two", "three" };

    var result = _list.Select((Value, Index) => new { Value, Index })
            .SingleOrDefault(l => l.Value == search);

    return result == null ? -1 : result.Index;
}

সুতরাং, এটি দিয়ে কল

GetItemIndex("two")ফিরে আসবে 1,

এবং

GetItemIndex("notthere")ফিরে আসবে -1

তথ্যসূত্র: লিনকসেমস.কম


1

এই কোড ব্যবহার করে দেখুন:

return context.EntitytableName.AsEnumerable().Find(p => p.LoginID.Equals(loginID) && p.Password.Equals(password)).Select(p => new ModelTableName{ FirstName = p.FirstName, UserID = p.UserID });

1

আমাদের যদি তালিকা থেকে কোনও উপাদান সন্ধান করতে হয় তবে আমরা Findএবং FindAllএক্সটেনশন পদ্ধতিটি ব্যবহার করতে পারি তবে তাদের মধ্যে সামান্য পার্থক্য রয়েছে। এখানে একটি উদাহরণ।

 List<int> items = new List<int>() { 10, 9, 8, 4, 8, 7, 8 };

  // It will return only one 8 as Find returns only the first occurrence of matched elements.
     var result = items.Find(ls => ls == 8);      
 // this will returns three {8,8,8} as FindAll returns all the matched elements.
      var result1 = items.FindAll(ls => ls == 8); 

1

এটি আপনাকে আপনার লিঙ্ক তালিকা অনুসন্ধানে প্রথম বা ডিফল্ট মান পেতে সহায়তা করবে

var results = _List.Where(item => item == search).FirstOrDefault();

এই অনুসন্ধানটি এটির প্রথম বা ডিফল্ট মানটি ফিরে আসবে।


0

আপনি অবজেক্ট তালিকায় একটি অবজেক্ট অনুসন্ধান করতে চান।

এটি আপনাকে আপনার লিঙ্ক তালিকা অনুসন্ধানে প্রথম বা ডিফল্ট মান পেতে সহায়তা করবে।

var item = list.FirstOrDefault(items =>  items.Reference == ent.BackToBackExternalReferenceId);

অথবা

var item = (from items in list
    where items.Reference == ent.BackToBackExternalReferenceId
    select items).FirstOrDefault();

0

আইইনুমারেবল থেকে মেসেজএকশন ক্লাস পেতে আপনি যেখানে লিনক এক্সটেনশান দিয়ে ফার্স্টঅফডিফল্ট ব্যবহার করতে পারেন। Reme

var ক্রিয়াকলাপ = বার্তা।

কোথায়

ক্রিয়াকলাপগুলি তালিকাভুক্ত করুন; সেট; }

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