जांचें कि क्या मान किसी सरणी में है (C #)


109

अगर C # में किसी ऐरे में कोई वैल्यू है तो मैं कैसे चेक करूं?

जैसे, मैं प्रिंटर नामों की सूची के साथ एक सरणी बनाना चाहता हूं।

ये एक विधि को खिलाया जाएगा, जो बदले में प्रत्येक स्ट्रिंग को देखेगा, और यदि स्ट्रिंग एक सरणी में मान के समान है, तो उस क्रिया को करें।

उदाहरण के लिए:

string[] printer = {"jupiter", "neptune", "pangea", "mercury", "sonic"};
foreach (p in printer)
{
   PrinterSetup(p);     
}

ये प्रिंटर के नाम हैं, इन्हें प्रिंटरसेटअप विधि से खिलाया जा रहा है।

प्रिंटरसेटअप कुछ इस तरह दिखेगा (कुछ छद्म कोड):

public void PrinterSetup(printer)
{
   if (printer == "jupiter") 
   {
      Process.Start("BLAH BLAH CODE TO ADD PRINTER VIA WINDOWS EXEC");
   }
}

मैं if (printer == "jupiter")इस तरह से कैसे प्रारूप करूं कि C # पहचान सके?


4
अपने पैरामीटर को एक प्रकार (स्ट्रिंग) नाम देने की कोशिश करें और यह ठीक हो जाएगा।
जॉन स्कीट

2
मैं सवाल के रूप में उलझन में हूँ। क्या आप पूछ रहे हैं कि किसी ऐरे में वैल्यू है या C # में स्ट्रिंग-तुलना कैसे करें? यदि यह बाद का है, तो आप उपयोग करेंगे printer.Equals("jupiter")। यदि यह पूर्व है, तो उपयोग करें linqऔरprinter.Contains("jupiter")
newffindy

@newffishy काफी ... सवाल उलझा हुआ है, उदाहरण कोड शीर्षक से मेल नहीं खाता है, और इस तरह उत्तर भ्रमित हैं; इस तरह बकवास क्यों उठती है, मेरे से परे है। और करने की कोई आवश्यकता नहीं है printer.Equals("jupiter")... ओपी कोड if (printer == "jupiter")ठीक काम करता है ... जब तक printerएक स्ट्रिंग घोषित किया जाता है, स्कीट नोट्स के रूप में।
जिम बेल्टर

जवाबों:


231

आवश्यक नामस्थान जोड़ें

using System.Linq;

फिर आप लाइनक Contains()विधि का उपयोग कर सकते हैं

string[] printer = {"jupiter", "neptune", "pangea", "mercury", "sonic"};
if(printer.Contains("jupiter"))
{
    Process.Start("BLAH BLAH CODE TO ADD PRINTER VIA WINDOWS EXEC"");
}

2
@ 0A0D। यह उत्तर है कि मुझे लगता है कि एक ही चीज़ ( How do I check if a value is in an array in C#?) और कुशल को प्राप्त करने के लिए सबसे सरल / सबसे सरल और सबसे अच्छा ज्ञात तरीका है । कोई लूप नहीं अतिरिक्त विधि। बस एक नाम स्थान अतिरिक्त है जो एक बड़ी बात नहीं है।
सामी

6
@Sami: Linq आंतरिक रूप से छोरों का उपयोग करता है।

2
@ 0A0D सैम शायद लिखित कोड की बात कर रहा है, संकलित निर्देशों का नहीं। Linq आंतरिक रूप से छोरों और विधियों का उपयोग करता है, लेकिन कोडर्स के दृष्टिकोण से यह सब छिपा हुआ है और इसके बारे में चिंतित होने की आवश्यकता नहीं है।
ट्रिस्ड

1
सही @ 0A0D। मेरा मतलब कोडर / डेवलपर को सही लूप की जरूरत नहीं थी। सरणी से ऑफ कोर्स की जांच के लिए लूप की आवश्यकता होती है :)
सामी

3
यह निश्चित रूप से आसान और अनुशंसित है। यदि आपके पास Linq तक पहुंच नहीं है, या Linq का उपयोग नहीं करना चाहते हैं, तो आप सरणी के कुछ स्पष्ट इंटरफ़ेस कार्यान्वयन पर भरोसा कर सकते हैं । .NET 1.1 के बाद से हमारे पास ((IList)printer).Contains("Jupiter")गैर-जेनेरिक (बॉक्स मूल्य प्रकार आदि) हो सकता है और यहां तक ​​कि बहु-आयामी सरणियों के लिए भी काम करता है। और .NET 2.0 के बाद से हमारे पास अधिक जादुई है ((IList<string>)printer).Contains("Jupiter")जो अधिक प्रकार-सुरक्षित है। Linq दृष्टिकोण .NET 3.5 में नया था।
जेपी स्टिग नीलसन

29
   string[] array = { "cat", "dot", "perls" };

// Use Array.Exists in different ways.
bool a = Array.Exists(array, element => element == "perls");
bool b = Array.Exists(array, element => element == "python");
bool c = Array.Exists(array, element => element.StartsWith("d"));
bool d = Array.Exists(array, element => element.StartsWith("x"));

// Display bools.
Console.WriteLine(a);
Console.WriteLine(b);
Console.WriteLine(c);
Console.WriteLine(d);
----------------------------output-----------------------------------

१) सच्चा २) झूठा ३) सच्चा ४) झूठा


6
यह स्वीकृत उत्तर होना चाहिए। यदि आप किसी सरणी का उपयोग करते हैं, तो यह पूरी तरह से संभव नहीं है, यह प्रदर्शन मायने रखता है। इस मामले में, Linq अक्सर गलत विकल्प होता है।

22
if ((new [] {"foo", "bar", "baaz"}).Contains("bar"))
{

}  

यह एक सामान्य उदाहरण है - क्या आप उस एक को प्रदान कर सकते हैं जो प्रश्न से बेहतर मेल खाता है?
काज

9
यह एक सामान्य उदाहरण हो सकता है, लेकिन यह वही है जो मैं देख रहा था।
ग्रांट बिर्चमियर

7

कुछ इस तरह?

string[] printer = {"jupiter", "neptune", "pangea", "mercury", "sonic"};
PrinterSetup(printer);

// redefine PrinterSetup this way:
public void PrinterSetup(string[] printer)
{
    foreach (p in printer.Where(c => c == "jupiter"))
    {
        Process.Start("BLAH BLAH CODE TO ADD PRINTER VIA WINDOWS EXEC"");
    }
}

7
    public static bool Contains(Array a, object val)
    {
        return Array.IndexOf(a, val) != -1;
    }

2
यह मुझे पंसद है। हालांकि, यह एक अपवाद के साथ aएक बहुआयामी सरणी (जैसे new string[10, 20, 15]उदाहरण के लिए) है, तो यह विफल हो जाएगा । यह एक आयामी सरणियों के साथ भी विफल हो जाएगा जो शून्य से अनुक्रमित नहीं होते हैं (जैसे कि Array.CreateInstance(typeof(string), new[] { 5, }, new[] { -2, }), C # I में दुर्लभ), संभवतः गलत रिटर्न मान के साथ। इन कमियों को जेनेरिक के साथ ठीक करना आसान है:public static bool Contains<TElement>(TElement[] a, TElement val) { return Array.IndexOf(a, val) != -1; }
जेपी स्टिग नीलसन

मैं इस तरह है, लेकिन केवल क्योंकि यह Linq के बिना है और यह पुष्टि की है कि indexOf केवल एक चीज है छोड़ दिया उपयोग करने के लिए।
बिटरब्लू

6

नोट: सवाल तार के सरणियों के बारे में है। उल्लिखित दिनचर्या को एकल तार के .Contains विधि के साथ मिश्रित नहीं किया जाना चाहिए।

मैं अलग-अलग C # संस्करणों की वजह से एक विस्तृत उत्तर जोड़ना चाहूंगा और दो कारणों से:

  • स्वीकृत उत्तर के लिए लाइनक की आवश्यकता होती है जो पूरी तरह से मुहावरेदार सी # है, जबकि यह लागत के बिना नहीं आता है, और सी # 2.0 या उससे नीचे में उपलब्ध नहीं है। जब कोई ऐरे सम्‍मिलित होता है, तो प्रदर्शन मायने रख सकता है, इसलिए ऐसी स्थितियाँ हैं, जहाँ आप ऐरे तरीकों से रहना चाहते हैं।

  • कोई भी उत्तर सीधे उस प्रश्न पर नहीं जाता है, जहां इसे किसी फ़ंक्शन में डालने के लिए कहा गया था (जैसा कि कुछ उत्तर स्ट्रिंग्स के सरणियों के साथ तार भी मिला रहे हैं, यह पूरी तरह से महत्वहीन नहीं है)।

Array.Exists () एक C # / है। NET 2.0 विधि और कोई Linq की जरूरत है। सरणियों में खोजना O (n) है। और भी तेजी से उपयोग के लिए हैशसेट या इसी तरह के संग्रह का उपयोग करें।

.NET 3.5 के बाद से एक सामान्य विधि भी मौजूद है Array<T>.Exists():

public void PrinterSetup(string[] printer)
{
   if (Array.Exists(printer, x => x == "jupiter"))
   {
      Process.Start("BLAH BLAH CODE TO ADD PRINTER VIA WINDOWS EXEC");
   }
}

आप एक ही / समान (समान) प्राप्त करने के लिए सिंथैटिक शक्कर को जोड़ने के लिए एक स्वयं की विस्तार विधि (C # 3.0 और ऊपर) लिख सकते हैं। लिनक सहित सभी सरणियों के लिए स्ट्रिंग के रूप में प्राप्त करता है:

// Using the generic extension method below as requested.
public void PrinterSetup(string[] printer)
{
   if (printer.ArrayContains("jupiter"))
   {
      Process.Start("BLAH BLAH CODE TO ADD PRINTER VIA WINDOWS EXEC");
   }
}

public static bool ArrayContains<T>(this T[] thisArray, T searchElement)
{
   // If you want this to find "null" values, you could change the code here
   return Array.Exists<T>(thisArray, x => x.Equals(searchElement));
}

इस मामले में इस ArrayContains()विधि का उपयोग किया जाता है, न कि लाइनक की सामग्री शामिल है।

अन्य जगहों पर उल्लेख किया गया है। तरीकों का उल्लेख है List<T>.Contains(सी # 2.0 के ArrayList.Containsबाद से ) या (सी # 1.1 के बाद से), लेकिन सीधे सरणियों के लिए नहीं।


1
मैं नाम बदलने के लिए ArrayContains () को Linq Contains () के साथ भ्रम से बचने का सुझाव देता हूं
peter.cyc

मैंने ऐसा किया है, हालांकि इसके खिलाफ तर्क भी हैं: यह विभिन्न डेटा प्रकारों के लिए एक ही नाम का उपयोग करने के लिए बहुरूपता का मूल विचार है, विशेष रूप से एक लाइनक-सेटिंग को ध्यान में रखते हुए। विभिन्न नामों का उपयोग करना बहुरूपता नहीं है। लेकिन पठनीयता और गलतफहमी से बचने के लिए जीत होगी, मुझे लगता है, इसलिए, हाँ।
फिलम

4

आप अपनी विधि में कुछ याद कर रहे हैं:

public void PrinterSetup(string printer)
{
   if (printer == "jupiter") 
   {
      Process.Start("BLAH BLAH CODE TO ADD PRINTER VIA WINDOWS EXEC"");
   }
}

बस जोड़ें stringऔर आप ठीक हो जाएंगे।


3

बहुत स्पष्ट नहीं है कि आपका मुद्दा क्या है, लेकिन ऐसा लगता है कि आप ऐसा कुछ चाहते हैं:

    List<string> printer = new List<string>( new [] { "jupiter", "neptune", "pangea", "mercury", "sonic" } );

    if( printer.Exists( p => p.Equals( "jupiter" ) ) )
    {
        ...
    }

2

लुकअप प्रदर्शन के लिए HashSet<T>क्लास का उपयोग करने पर विचार करें :

यह विधि एक ओ (1) ऑपरेशन है।

- HashSet<T>.Containsविधि (टी), एमएसडीएन

उदाहरण के लिए:

class PrinterInstaller
{
    private static readonly HashSet<string> PrinterNames = new HashSet<string>
        {
            "jupiter", "neptune", "pangea", "mercury", "sonic"
        };

    public void Setup(string printerName)
    {
        if (!PrinterNames.Contains(printerName))
        {
            throw new ArgumentException("Unknown printer name", "printerName");
        }
        // ...
    }
}

1

मैं अब 2h पर खोज करता हूँ कि कैसे एक सूची में डुप्लिकेट खोजने के लिए और उन्हें कैसे निकालना है । यहाँ सबसे सरल उत्तर है:

//Copy the string array with the filtered data of the analytics db into an list
// a list should be easier to use
List<string> list_filtered_data = new List<string>(analytics_db_filtered_data);

// Get distinct elements and convert into a list again.
List<string> distinct = list_filtered_data.Distinct().ToList();

आउटपुट इस तरह दिखेगा: डुप्लिकेटेड एलिमेंट्स को नई सूची में हटा दिया जाएगा जिसे विशिष्ट कहा जाता है!

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