তালিকায় একটি স্ট্রিং রয়েছে এমন উপাদান রয়েছে কিনা তা পরীক্ষা করুন এবং সেই উপাদানটি পান কিনা


146

এই প্রশ্নের উত্তর খুঁজতে গিয়ে, আমি লিনকিউ ব্যবহার করে একই রকমের মধ্যে চলেছি কিন্তু আমি এগুলির সাথে পরিচিত না হওয়ায় আমি সেগুলি পুরোপুরি বুঝতে সক্ষম হয়েছি (এবং এইভাবে সেগুলি বাস্তবায়ন করব)) আমি মূলত যা করতে চাই তা হ'ল:

  1. তালিকার কোনও উপাদানটিতে একটি নির্দিষ্ট স্ট্রিং রয়েছে কিনা তা পরীক্ষা করুন।
  2. যদি তা হয় তবে সেই উপাদানটি পান।

আমি কীভাবে এটি করতে যাব তা আমি সত্যই জানি না। আমি যা সামনে আসতে পারি তা হ'ল এটি (অবশ্যই কাজ করছে না):

if (myList.Contains(myString))
    string element = myList.ElementAt(myList.IndexOf(myString));

আমি জানি কেন এটি কাজ করে না:

  • myList.Contains()ফিরবে না true, যেহেতু এটি তালিকাটির পুরো উপাদানটি আমার দ্বারা নির্দিষ্ট করা স্ট্রিংয়ের সাথে মেলে কিনা তা পরীক্ষা করবে।
  • myList.IndexOf() কোনও ঘটনা খুঁজে পাবে না, যেহেতু এটি আবার কেস হিসাবে দেখা যায়, এটি স্ট্রিংয়ের সাথে মিলে যাওয়া কোনও উপাদান অনুসন্ধান করবে।

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

সম্পাদনা: আমি একটি সমাধান নিয়ে এসেছি; কেবল তালিকার মধ্য দিয়ে লুপ করুন, বর্তমান উপাদানটিতে স্ট্রিং রয়েছে কিনা তা পরীক্ষা করুন এবং তারপরে বর্তমান উপাদানটির সমান একটি স্ট্রিং সেট করুন। আমি ভাবছি, যদিও এর চেয়ে আরও কার্যকর কোনও উপায় আছে?

string myString = "bla";
string element = "";

for (int i = 0; i < myList.Count; i++)
{
    if (myList[i].Contains(myString))
        element = myList[i];
}

আমি আমার উত্তরে যেমন উল্লেখ করেছি, পুরানো ফ্যাশন লুপগুলি (যেমন আপনার প্রশ্ন হিসাবে রয়েছে) প্রায় সবসময় দ্রুত হয়। আপনি যথেষ্ট যত্ন যদি আপনি পারফেক্ট পরীক্ষা করতে পারে।
ম্যাককে

আপনার তালিকায় থাকা স্ট্রিংগুলিতে একাধিক স্ট্রিং থাকতে পারে myString, আপনার বর্তমান লুপে আপনি শেষ উপাদানটি পাবেন। এটি আপনার উপর নির্ভর করে যদি আপনি প্রথম বা শেষটি সন্ধান করতে চান, আপনি যদি প্রথমটি সন্ধান করতে চান তবে আইটেমটি সন্ধানের পরে লুপটি ভেঙে দিন।
হাবিব

উত্তর:


193

আপনার এখানে লিঙ্ক ব্যবহার করতে সক্ষম হওয়া উচিত:

var matchingvalues = myList
    .Where(stringToCheck => stringToCheck.Contains(myString));

যদি আপনি কেবল প্রথম ম্যাচের আইটেমটি ফিরে আসতে চান:

var match = myList
    .FirstOrDefault(stringToCheck => stringToCheck.Contains(myString));

if(match != null)
    //Do stuff

+1 - বা আপনার দ্বিতীয় ক্ষেত্রে এর Whereসাথে প্রতিস্থাপন করুনFirstOrDefaultmyList.FirstOrDefault(stringToCheck => stringToCheck.Contains(myString))
হাবিব

দুর্দান্ত উত্তর। কৌতূহলের বাইরে, যদিও: কেন এটি matchingসংকলন-নির্ধারিত ( var)? যেহেতু আমি জানি যে আমার তালিকাটি প্রকারভেদ String, তাই string matchingএই ক্ষেত্রে এটি ব্যবহার করা কি নিরাপদ হবে ?
দিমিত্রিস ইলিয়াডিস

1
@ জিমিলিয়াডিস "ভার" এবং "স্ট্রিং" এর অর্থ হ'ল একই জিনিস - সংকলকটি যথেষ্ট স্মার্ট যে ফলাফলটি কেবল 'স্ট্রিং' হতে পারে। var সত্যিই কেবল কোডিং শৈলীর জিনিস (যখন বেনামে ব্যবহার না করা হয়)
ডেভ বিশ

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

@ ডার্টিডেভোপার এটির অর্থ কী তা নিশ্চিত নন - লক্ষ্য তালিকায় কোনও খালি স্ট্রিং না থাকলে আপনার উদাহরণটি বাতিল হয়ে যাবে ull আপনি যদি ঠিকঠাক প্রকারের উপরে ফার্স্টআরডিফল্ট () ব্যবহার করার চেষ্টা করছেন তবে আপনি ঠিক বলেছেন, যেমন <<> তালিকা <<< - ফার্স্টঅর্ডাফল্ট () '0' ফিরে আসবে এবং নাল নয় - তবে, প্রশ্নটি বিশেষত স্ট্রিং সম্পর্কে ছিল
ডেভ বিশ

29

প্রাথমিক উত্তরটি হ'ল: আপনাকে লুপের মাধ্যমে পুনরাবৃত্তি করতে হবে এবং কোনও উপাদানকে নির্দিষ্ট স্ট্রিং রয়েছে কিনা তা পরীক্ষা করতে হবে। সুতরাং, কোডটি এইভাবে বলা যাক:

foreach(string item in myList)
{
    if(item.Contains(myString))
       return item;
}

সমতুল্য, কিন্তু সংক্ষিপ্ত, কোডটি হ'ল:

mylist.Where(x => x.Contains(myString)).FirstOrDefault();

এখানে, x একটি প্যারামিটার যা উপরের কোডটিতে "আইটেম" এর মতো কাজ করে।



9
for (int i = 0; i < myList.Length; i++)
{
    if (myList[i].Contains(myString)) // (you use the word "contains". either equals or indexof might be appropriate)
    {
        return i;
    }
}

পুরানো ফ্যাশন লুপগুলি প্রায় সর্বদা দ্রুত।


যেহেতু আমি দক্ষতার জন্য যাচ্ছি, আপনি কি পরামর্শ দিচ্ছেন যে এই পদ্ধতিটি দ্রুত (এইভাবে আরও দক্ষ)?
দিমিত্রিস ইলিয়াডিস

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

তালিকাগুলি কেন ব্যবহার করবেন না?
F8ER

@ ভি .7. কারণ তিনি কেবলমাত্র তালিকার একটি আইটেমে একটি স্ট্রিং রয়েছে কিনা তা জানতে চান। list.equals, কাজের জন্য সঠিক সরঞ্জাম নয় ["abc", "Def", "ghi"] এতে ওপিকে যেভাবে বর্ণনা করেছে "হাই" রয়েছে। list.equals এমনকি সঠিক ডেটাটাইপ গ্রহণ করে না।
ম্যাককে

6

আপনি যদি আপনার স্ট্রিংযুক্ত স্ট্রিংগুলির একটি তালিকা চান:

var newList = myList.Where(x => x.Contains(myString)).ToList();

আরেকটি বিকল্প হ'ল লিনক ফার্স্টআরডিফল্ট ব্যবহার করা

var element = myList.Where(x => x.Contains(myString)).FirstOrDefault();

মনে রাখবেন যে Containsপদ্ধতিটি কেস সংবেদনশীল।


1
কেস সংবেদনশীল সম্পর্কে ভালো অনুস্মারক, StringComparison.InvariantCultureIgnoreCase বাস্তবায়ন
JoshYates1980

2

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

string element = myList.FirstOrDefault(s => s.Contains(myString));

এটি মুষ্টির উপাদানটি ফেরত দেবে যা স্ট্রিংগুলিকে অন্তর্ভুক্ত করে myStringবা nullযদি এমন কোনও উপাদান খুঁজে পাওয়া যায় না।

আপনার যদি প্রয়োজন সমস্ত সূচক হয় তবে List<T>শ্রেণীর FindIndexপদ্ধতিটি ব্যবহার করুন :

int index = myList.FindIndex(s => s.Contains(myString));

এটি মুষ্টি উপাদানটির সূচকটি ফেরত পাঠাবে যা স্ট্রিংগুলিকে অন্তর্ভুক্ত করে myString, বা -1যদি এমন কোনও উপাদান খুঁজে পাওয়া যায় না।


2

অনেক ভাল এখানে উত্তর, কিন্তু আমি ব্যবহার করে একটি সহজ একটি ব্যবহার হইবে , নীচের হিসাবে:

foreach (var setting in FullList)
{
    if(cleanList.Exists(x => x.ProcedureName == setting.ProcedureName)) 
       setting.IsActive = true; // do you business logic here 
    else
       setting.IsActive = false;
    updateList.Add(setting);
}

2

আপনার এমন কিছু ব্যবহার করতে সক্ষম হওয়া উচিত, এটি আমার পক্ষে ঠিক কাজ করেছে:

var valuesToMatch = yourList.Where(stringCheck => stringCheck.Contains(myString));

বা এই জাতীয় কিছু, আপনার কোথায় এটির মিল নেই সেদিকে নজর দেওয়া দরকার।

 var valuesToMatch = yourList.Where(stringCheck => !stringCheck.Contains(myString));

1

তুমি ব্যবহার করতে পার

var match=myList.Where(item=>item.Contains("Required String"));
foreach(var i in match)
{
//do something with the matched items
}

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

সুতরাং আপনি "তালিকা থেকে আইটেমগুলি পান যেখানে এটি একটি প্রদত্ত শর্তকে সন্তুষ্ট করে" এর মতো করছেন are

আপনি যেখানে "ল্যাম্বডা এক্সপ্রেশন" ব্যবহার করছেন তার ভিতরে

সংক্ষেপে ল্যাম্বদা এক্সপ্রেশন বলতে কিছু হ'ল (ইনপুট প্যারামিটার => রিটার্ন মান)

সুতরাং একটি প্যারামিটার "আইটেম" এর জন্য, এটি "আইটেমটি প্রদান করে ont কনটেনগুলি (" প্রয়োজনীয় স্ট্রিং ")"। সুতরাং আইটেমটিতে স্ট্রিং রয়েছে এবং এটি শর্তটি সন্তুষ্ট করার পরে তালিকা থেকে এটি নির্বাচিত হয়ে যায় তবে এটি সত্য হয়।


1

এটি সহজ রাখতে এটি ব্যবহার করুন;

foreach(string item in myList)//Iterate through each item.
{
 if(item.Contains("Search Term")//True if the item contains search pattern.
 {
   return item;//Return the matched item.
 }
}

বিকল্পভাবে, লুপের জন্য এটি করতে, এটি ব্যবহার করুন;

    for (int iterator = 0; iterator < myList.Count; iterator++)
    {
        if (myList[iterator].Contains("String Pattern"))
        {
            return myList[iterator];
        }
    }

কেবল উল্লেখ করার জন্য, আপনি কোডের কোনও একটি লাইন বন্ধের বন্ধনীটি মিস করেছেন .. যদি (আইটেম.সামগ্রী ("অনুসন্ধানের মেয়াদ"))
অ্যালেক্স

0

আমি অন্যান্য উত্তরে বুল বিকল্পটি দেখিনি তাই আমি আশা করি নীচের কোডটি কাউকে সহায়তা করবে।

শুধু ব্যবহার Any()

string myString = "test";
bool exists = myList
             .Where(w => w.COLUMN_TO_CHECK.Contains(myString)).Any();

0

যে কোনও, যেখানে, প্রথম এবং ফার্স্টঅর ডিফল্ট একত্রিত করা সম্ভব; বা কেবল প্রয়োজনীয়গুলির উপর নির্ভর করে সেই পদ্ধতিগুলির মধ্যে কোনওটিতে শিকারী রাখুন।

কোনও মিল খুঁজে পাওয়া না গেলে আপনি সম্ভবত ব্যতিক্রম নষ্ট না করতে পারলে আপনার সম্ভবত প্রথমটি এড়ানো উচিত। ফার্স্টআরডিফল্ট সাধারণত যতক্ষণ না আপনি জানেন যে কোনও মিল না পাওয়া গেলে টাইপের ডিফল্টটি ফিরে আসবে (স্ট্রিংয়ের ডিফল্টটি নাল, ইনট 0, বুল মিথ্যা, ইত্যাদি) option

using System.Collections.Generic;
using System.Linq;


bool exists;
string firstMatch;
IEnumerable<string> matchingList;

var myList = new List<string>() { "foo", "bar", "foobar" };

exists = myList.Any(x => x.Contains("o"));
// exists => true

firstMatch = myList.FirstOrDefault(x => x.Contains("o"));
firstMatch = myList.First(x => x.Contains("o"));
// firstMatch => "foo"

firstMatch = myList.First(x => x.Contains("dark side"));
// throws exception because no element contains "dark side"

firstMatch = myList.FirstOrDefault(x => x.Contains("dark side"));
// firstMatch => null

matchingList = myList.Where(x => x.Contains("o")); 
// matchingList => { "foo", "foobar" }

এই কোডটি @ https://rextester.com/TXDL57489 পরীক্ষা করুন

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