सरणी में स्ट्रिंग है?


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
@ ब्रैड: ऐसा इसलिए है क्योंकि इसकी एक विस्तार विधि Enumerable से आ रही है।
एंथनीवजोन

8
एक-लाइनर के रूप में:(new string[] { "foo", "bar" }).Contains("foo")
डेनिस V

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");जो मैं करना चाहता हूं, जो पहले कॉलम में देखने योग्य है, यह देखने के लिए कि क्या मान निम्न स्ट्रिंग्स में से किसी में समाप्त नहीं होता है .. यदि वे नहीं करते हैं, तो मैं एक स्ट्रिंग बताते हुए वापस लौटना चाहता हूं। यह .00आपके उदाहरण का उपयोग करके उदाहरण के लिए एक मूल्य याद आ रहा है मैं इसे पाने के लिए एक काम नहीं कर सकता यह थोड़ा मुश्किल है क्योंकि मैं एक बूल वापस नहीं करना चाहता हूं मैंने एक स्ट्रिंग वापस करने के लिए आपके तरीके को बदल दिया है, लेकिन फिर भी कोई सुझाव काम नहीं करता है
पद्धति मनुष्य

यह साइट पर एक प्रश्न के रूप में बेहतर लगता है। आगे बढ़ें और यदि आवश्यक हो तो इस उत्तर को देखें।
गेब्रियल मैकएडम्स

मैं वास्तव में वह करने के लिए एक भयानक तरीका के साथ आने में सक्षम था जो मैं करना चाहता था मैंने कुछ ऐसा लिखा था जो यह जांच करेगा कि क्या डेटाटैबल्स के लिए एक लूप के अंदर स्ट्रिंग का मान ItemArray, निम्नलिखित में से किसी भी मूल्य के साथ समाप्त होता है जो मेरे पास था string public static bool EndWithValue(this string value, IEnumerable<string> values) { return values.Any(item => value.EndsWith(item)); }
मेथडमैन

12

आप Array.Exists फ़ंक्शन (या यदि आप .NET 3.5 का उपयोग कर रहे हैं, तो इसमें विस्तार विधि शामिल है) के बाद बस।


3
यहाँ .NET 2.0 के लिए एक काम उदाहरण है: अगर (Array.Exists (arrayToLookThrough, ओ => ओ == elementToSearchFor))
ईंधन

7

Linq (s & g के लिए):

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

Arrays, सामान्य रूप से, उपयोग करने के लिए एक खराब डेटा संरचना है यदि आप पूछना चाहते हैं कि कोई विशेष वस्तु संग्रह में है या नहीं।

यदि आप बार-बार इस खोज को चला रहे हैं, तो इसका उपयोग करने लायक हो सकता है Dictionary<string, something> एक सरणी के बजाय । किसी शब्दकोश में लुकअप O (1) (स्थिर-समय) है, जबकि सरणी के माध्यम से खोज O (N) है (समय सरणी की लंबाई के लिए आनुपातिक लेता है)।

भले ही सरणी अधिकतम 200 आइटम हो, अगर आप इन खोजों में से बहुत कुछ करते हैं, तो शब्दकोश की संभावना तेज होगी।


1
बाइनरी-सर्च ओ (लॉग एन) है; शब्दकोश O (1) तक घटाता है - लेकिन बहुत अधिक ओवरहेड है; छोटे-से-मध्य आकार के लिए, रैखिक खोज या बाइनरी खोज आउट-प्रदर्शन कर सकते हैं।
मार्क Gravell

1

आप सरणी पर पुनरावृति करने के लिए LINQ का भी उपयोग कर सकते हैं। या आप उस खोज विधि का उपयोग कर सकते हैं जो इसके लिए एक प्रतिनिधि लेता है। हालाँकि मुझे लगता है कि खोज विधि थोड़ी अधिक महंगी है और इसके माध्यम से सिर्फ लूपिंग है।


खोज विधि एल्गोरिथ्म "लूपिंग-थ्रू" विधि के समान होगी। कोई भी अतिरिक्त व्यय कुछ वस्तु निर्माण और शायद एक परत या दो अप्रत्यक्ष होगा, लेकिन, यदि आप पठनीयता की कीमत पर उन लोगों के अनुकूलन के बारे में चिंता कर रहे हैं, तो आप गलत चीजों के बारे में चिंता कर रहे हैं।
17

1

जैसा कि ऊपर दिए गए धागे में कई बार उल्लेख किया गया है, यह उपयोग में ढांचे पर निर्भर है। .Net फ्रेमवर्क 3 और इसके बाद के संस्करण के पास .Contains () या Exist () तरीके हैं। नीचे दिए गए अन्य ढांचे के लिए, सरणी के माध्यम से लूपिंग के बजाय निम्नलिखित चाल कर सकते हैं ...

((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;
    }

LINQ का उपयोग स्ट्रिंग के माध्यम से पुनरावृत्ति करने से तेज है जैसा कि उदाहरण में किया गया था। strArray.Contains (कुंजी) वह सब है जो वास्तव में आवश्यक है
क्रिस बैलेंस

3
पर्दे के पीछे, strArray.Contains (कुंजी) वैसे भी सरणी के माध्यम से लूप करने जा रहा है ... इसमें कोई जादू शामिल नहीं है जो आपको O (n) खोज करने से बाहर कर देता है।
भयानक शहर

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
);

जब प्रेडिक्ट सच हो जाता है तो एक बार कैटइनसाइड सच हो जाएगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.