অ্যারে মধ্যে স্ট্রিং হয়?


107

string[]এটিতে কোনও উপাদান রয়েছে কিনা তা দেখার জন্য সর্বোত্তম উপায় কী হবে । এটি এটি আমার প্রথম শট ছিল। তবে সম্ভবত এমন কিছু আছে যা আমি উপেক্ষা করছি। অ্যারের আকার 200 টি উপাদানের চেয়ে বড় হবে না।

bool isStringInArray(string[] strArray, string key)
{
    for (int i = 0; i <= strArray.Length - 1; i++)
        if (strArray[i] == key)
            return true;
    return false;
}

উত্তর:


210

ইতিমধ্যে অন্তর্নির্মিত অন্তর্ভুক্ত () পদ্ধতিটি ব্যবহার করুন:

using System.Linq;

//...

string[] array = { "foo", "bar" };
if (array.Contains("foo")) {
    //...
}

কোনও কারণে যখন আমি প্রথম পদ্ধতিটি অনুসন্ধান করেছিলাম তখন আমি এটি খুঁজে পেলাম না ... ধন্যবাদ।
ব্র্যাড

4
@ ব্র্যাড: কারণ এটি একটি এক্সটেনশন পদ্ধতিটি গণনাযোগ্য থেকে আসছে।
অ্যান্টনিডব্লু জোন্স 17

8
ওয়ান-লাইনার হিসাবে:(new string[] { "foo", "bar" }).Contains("foo")
ডেনিস ভি

8
এমনকি আরও ছোট:new[] { "foo", "bar" }.Contains(foo)
এরিক বোলে-ফেয়সট

25

আমি জানি এটি পুরানো, তবে আমি নতুন পাঠকদের জানতে চেয়েছিলাম যে জেনেরিকস এবং এক্সটেনশন পদ্ধতি ব্যবহার করে এটি করার একটি নতুন পদ্ধতি রয়েছে।

আপনি আমার ব্লগ পোস্ট পড়তে পারেন কীভাবে করা যায় সে সম্পর্কে আরও তথ্য দেখতে আপনি তবে মূল ধারণাটি হ'ল:

আপনার কোডে এই এক্সটেনশন পদ্ধতিটি যুক্ত করে:

public static bool IsIn<T>(this T source, params T[] values)
{
    return values.Contains(source);
}

আপনি আপনার অনুসন্ধানটি এভাবে সম্পাদন করতে পারেন:

string myStr = "str3"; 
bool found = myStr.IsIn("str1", "str2", "str3", "str4");

এটি যে কোনও প্রকারে (যতক্ষণ আপনি একটি ভাল সমতুল্য পদ্ধতি তৈরি করেন) কাজ করে। নিশ্চিত যে কোনও মান টাইপ।


আমার যা কিছু করতে চাই var xxx = csvData.Rows[0].ItemArray[0].IsIn(".00", "0.0", ".25", "0.5", ".5", ".50", ".75");তা হ'ল প্রথম কলামে ডেটেবলযোগ্য কে দেখে নেওয়া উচিত যে নীচের স্ট্রিংগুলির কোনওটিতে মানগুলি শেষ হচ্ছে না কিনা .. যদি সেগুলি না থাকে তবে আমি একটি স্ট্রিং ফিরিয়ে আনতে চাই that .00উদাহরণস্বরূপ এটির কোনও মূল্য নেই উদাহরণস্বরূপ আপনার উদাহরণটি ব্যবহার করে আমি এটির কাজটি করা কিছুটা জটিল বলে মনে হচ্ছে না কারণ আমি কোনও বুল ফিরিয়ে দিতে চাই না আমি একটি স্ট্রিং ফিরিয়ে দেওয়ার জন্য আপনার পদ্ধতিটি পরিবর্তন করেছি তবে এখনও কোনও পরামর্শ কার্যকর হয় না
মেথডম্যান

এটি সাইটে একটি প্রশ্ন হিসাবে উত্থাপিত বলে মনে হয় ভাল। এগিয়ে যান এবং প্রয়োজনে এই উত্তর রেফারেন্স।
গ্যাব্রিয়েল ম্যাকএডামস

আমি যা করতে চাইছিলাম তা করার জন্য আমি একটি দুর্দান্ত উপায় নিয়ে আসতে সক্ষম হয়েছি আমি এমন কিছু লিখেছিলাম যা পরীক্ষা করবে যে ডেটাবেটস আইটেমআরির জন্য একটি লুপের অভ্যন্তরে একটি স্ট্রিংয়ের মানগুলি অন্তর্ভুক্ত ছিল আমার সাথে নিম্নলিখিত মানগুলির সাথে শেষ স্ট্রিং public static bool EndWithValue(this string value, IEnumerable<string> values) { return values.Any(item => value.EndsWith(item)); }
মেথডম্যান

12

আপনি কেবল অ্যারে.এক্সজিস্ট ফাংশনের পরে (বা আপনি .NET 3.5 ব্যবহার করছেন তবে এটি এক্সটেনশন পদ্ধতি ধারণ করে যা কিছুটা সুবিধাজনক)।


3
নেট নেট ২.০ এর জন্য এখানে একটি কার্যকারী উদাহরণ রয়েছে: যদি (অ্যারে.একজিস্টস (অ্যারেটুকলুকথ্রো, ও => ও == এলিমেন্টটুকু অনুসন্ধান))
জ্বালানিতে

7

লিনক (এস ও জি এর জন্য):

var test = "This is the string I'm looking for";
var found = strArray.Any(x=>x == test);

বা, প্রয়োজনীয়তার উপর নির্ভর করে

var found = strArray.Any(
    x=>x.Equals(test, StringComparison.OrdinalIgnoreCase));

6

অ্যারে বাছাই করা হয়? যদি তাই হয় তবে আপনি বাইনারি অনুসন্ধান করতে পারেন । এখানে NET বাস্তবায়নও রয়েছে। যদি অ্যারে বাছাই করা হয় তবে একটি বাইনারি অনুসন্ধান যেকোন পুনরাবৃত্ত সমাধানের চেয়ে কার্যকারিতা উন্নত করবে।


2

অ্যারেগুলি সাধারণভাবে, কোনও নির্দিষ্ট বিষয়বস্তু সংগ্রহের মধ্যে রয়েছে কি না তা জানতে চাইলে ব্যবহার করার জন্য একটি দুর্বল ডেটা স্ট্রাকচার।

আপনি যদি এই অনুসন্ধানটি ঘন ঘন চালাচ্ছেন তবে এটি ব্যবহার করার পক্ষে এটি উপযুক্ত হবে Dictionary<string, something> অ্যারের পরিবর্তে পক্ষে উপযুক্ত। একটি অভিধানে অনুসন্ধানগুলি হ'ল ও (1) (ধ্রুবক-সময়), অ্যারের মাধ্যমে অনুসন্ধান করা হয় ও (এন) (অ্যারের দৈর্ঘ্যের সাথে আনুপাতিক সময় নেয়)।

অ্যারে সর্বাধিক মাত্র 200 টি আইটেম হলেও আপনি যদি এই সন্ধানগুলি প্রচুর পরিমাণে করেন তবে অভিধান সম্ভবত দ্রুত হবে।


1
বাইনারি-অনুসন্ধান হল ও (লগ এন); অভিধান ও (1) এর অধীন করে - তবে প্রচুর ওভারহেড রয়েছে; ছোট থেকে মাঝের আকারের জন্য, রৈখিক অনুসন্ধান বা বাইনারি অনুসন্ধান আউট-পারফর্ম করতে পারে।
মার্ক গ্র্যাভেল

1

অ্যারের মাধ্যমে পুনরাবৃত্তি করতে আপনি লিনকিউও ব্যবহার করতে পারেন। অথবা আপনি এটি সন্ধানের জন্য কোনও প্রতিনিধি লাগে এমন সন্ধানের পদ্ধতিটি ব্যবহার করতে পারেন। তবে আমি মনে করি যে অনুসন্ধানের পদ্ধতিটি আরও ব্যয়বহুল তবে কেবল লুপিং।


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

1

উপরের থ্রেডে অনেকবার উল্লিখিত হিসাবে, এটি ব্যবহৃত কাঠামোর উপর নির্ভরশীল। .NET ফ্রেমওয়ার্ক 3 এবং তারপরে অ্যারেগুলির জন্য .Contains () বা অস্তিত্ব () পদ্ধতি রয়েছে। নীচের অন্যান্য ফ্রেমওয়ার্কগুলির জন্য, অ্যারের মাধ্যমে লুপিংয়ের পরিবর্তে নিম্নলিখিত কৌশলটি করতে পারেন ...

((IList<string>)"Your String Array Here").Contains("Your Search String Here")

দক্ষতার উপর খুব নিশ্চিত না ... ডেভ


0

এটি ম্যানুয়ালি অ্যারের মাধ্যমে পুনরাবৃত্ত হওয়ার চেয়ে দ্রুত:

static bool isStringInArray(string[] strArray, string key)
    {

        if (strArray.Contains(key))
            return true;
        return false;
    }

উদাহরণ হিসাবে যেমন লাইনকিউ ব্যবহার করা স্ট্রিংয়ের মাধ্যমে পুনরাবৃত্তি করা তার চেয়ে দ্রুততর। strArray.Contains (কী) যা যা আসলেই প্রয়োজনীয়
ক্রিস ব্যালেন্স

3
পর্দার আড়ালে, strArray.Contains (কী) যাইহোক যাইহোক অ্যারেটি লুপ করতে চলেছে ... এমন কোনও জাদু জড়িত নেই যা আপনাকে ও (এন) অনুসন্ধান করে বেরিয়ে আসে।
আশ্চর্যজনকভাবে ফাউন

0

আপনি যদি চান না বা কেবল লিনক ব্যবহার করতে না পারেন তবে আপনি স্থির Array.Exists(...);ফাংশনটিও ব্যবহার করতে পারেন :

https://msdn.microsoft.com/en-us/library/yw84x8be%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

var arr = new string[]{"bird","foo","cat","dog"};

var catInside = Array.Exists( 
  arr, // your Array
  (s)=>{ return s == "cat"; } // the Predicate
);

যখন প্রিডিকেট সত্য ফিরে আসবে তখন ক্যাটআইনসাইডটিও সত্য হবে।

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