क्या कोई C # IN ऑपरेटर है?


89

SQL में, आप निम्न सिंटैक्स का उपयोग कर सकते हैं:

SELECT *
FROM MY_TABLE
WHERE VALUE_1 IN (1, 2, 3)

क्या C # में एक समतुल्य है? आईडीई एक कीवर्ड के रूप में "में" को पहचानता है, लेकिन मुझे इस पर कोई जानकारी नहीं मिल रही है।

तो, क्या निम्नलिखित में से कुछ करना संभव है:

int myValue = 1;
if (myValue in (1, 2, 3))
    // Do something

के बजाय

int myValue = 1;
if (myValue == 1 || myValue == 2 || myValue == 3)
    // Do something

मैंने इसे स्पष्ट करने के लिए थोड़ा सा संपादित किया है कि मैं क्या तुलना करने की कोशिश कर रहा था
पॉल माइकल्स

मेरे द्वारा जोड़ा गया एक और उत्तर देखें
प्रणय राणा


3
@chiccodoro अगर यह प्रश्न पहले पूछा गया है, तो इसे एक डुप्लिकेट के रूप में चिह्नित करें और मूल प्रश्न के लिंक के साथ उत्तर पोस्ट करें, बस एक नकारात्मक टिप्पणी न छोड़ें
हनीश मनी

जवाबों:


125

यदि आप लिखना चाहते हैं। तब आप एक एक्सटेंशन बना सकते हैं जो आपको ऐसा करने की अनुमति देता है।

static class Extensions
{

    public static bool In<T>(this T item, params T[] items)
    {
        if (items == null)
            throw new ArgumentNullException("items");

        return items.Contains(item);
    }

}


class Program
{

    static void Main()
    {


        int myValue = 1;

        if (myValue.In(1, 2, 3))
            // Do Somthing...

        string ds = "Bob";

        if (ds.In("andy", "joel", "matt")) 
        // Do Someting...
    }
}

1
बस System.Linq का उपयोग करके जोड़ना याद रखें;
टान्नर ओरलेंस

इसमें इतना बेहतर है कि इसमें पढ़ा जा सके ... समझने में आसान है
कोनराड

84

List.Contains()क्या मुझे लगता है कि तुम क्या देख रहे हो। C # में in keywordएक ऐसा नहीं है operatorजो पूरी तरह से अलग उद्देश्य से कार्य करता है और फिर आप SQL में क्या उल्लेख कर रहे हैं।

inC # में कीवर्ड का उपयोग करने के दो तरीके हैं । मान लें कि आपके पास एक स्ट्रिंग है [] या C # में सूची।

        string[] names; //assume there are some names;

        //find all names that start with "a"
        var results = from str in names
                      where str.StartsWith("a")
                      select str;

        //iterate through all names in results and print
        foreach (string name in results)
        {
            Console.WriteLine(name);
        }

आपके संपादन का जिक्र करते हुए, मुझे आपका कोड इस तरह से करना चाहिए कि आपको क्या करना है।

        int myValue = 1;
        List<int> checkValues = new List<int> { 1, 2, 3 };

        if (checkValues.Contains(myValue))
            // Do something 

4
लोग SQL देखते हैं और तुरंत LINQ में कूद जाते हैं, लेकिन यह सरल कार्य शायद वही है जो वह चाहता है
बार्ट वैन ह्युकेलोम

29

तुम यह केर सकते हो:

var x = 99; // searched value

if (new[] {1,2,3,99}.Contains(x))
{
   // do something
}

2
मैंने उच्च मतदान वाले लोगों को इस जवाब को प्राथमिकता दी क्योंकि बार-बार समानता की जांच करने के बजाय IN में कोड जटिलता को कम करना है, और यह अच्छा और छोटा और सरल है!
MrVimes

1
शुक्रिया @MrVimes!
JwJosefy

7

आप आमतौर पर Containsएक संग्रह की विधि का उपयोग करते हैं ।

myCollection.Where(p => Enumerable.Range(1,3).Contains(p));

मुझे उम्मीद है यह मदद करेगा।


6

कोई भी "इन" सी # में ऑपरेटर नहीं है, "इन" कीवर्ड का उपयोग केवल "फॉरचेक (... इन ...)" या "इन ... इन ..." के साथ किया जाता है।

आपकी SQL क्वेरी के बराबर LINQ होगा:

List<int> list = new List<int> { 1, 2, 3 };
var query = from row in my_table
            where list.Contains(row.value1)
            select row;

4

डुप्लिकेट ऑफ़: LINQ to SQL इन और नॉट इन

select * from table where fieldname in ('val1', 'val2') 

या

select * from table where fieldname not in (1, 2) 

LINQ to SQL में IN और NOT IN प्रश्नों के बराबर कुछ इस तरह होगा:

List<string> validValues = new List<string>() { "val1", "val2"}; 
var qry = from item in dataContext.TableName 
          where validValues.Contains(item.FieldName) 
          select item; 

और इस:

List<int> validValues = new List<int>() { 1, 2}; 
var qry = from item in dataContext.TableName 
          where !validValues.Contains(item.FieldName) 
          select item; 

हाँ - क्षमा करें, मैंने अपना प्रश्न संपादित कर लिया है, क्योंकि मैं जो पूछ रहा हूं, वह लिनक से संबंधित नहीं है
पॉल माइकल्स

4

मैं मानता हूं कि ऑपरेटर को लागू करने का सबसे अच्छा तरीका एक एक्सटेंशन विधि है। मैंने इसे थोड़ा अलग तरीके से किया:

public static bool In(this string str, string CommaDelimintedStringSet)
{
    string[] Values = CommaDelimintedStringSet.Split(new char[] { ',' });
    foreach (string V in Values)
    {
       if (str == V)
         return true;
    }
    return false;
}

अंतर यह है कि आपको प्रत्येक मान के चारों ओर उद्धरण नहीं देना है, केवल कॉमा सीमांकित मानों का पूरा सेट है, जो टाइप करना आसान है:

bool result = MyString.In("Val1,Val2,Val3");

इस समारोह के साथ परम-सरणियों का उपयोग करना बेहतर होगा। public static bool In(this string str, params string[] stringSet)इसे लाइक और कॉल करेंbool result = myString.In("Val1", "Val2", "Val3")
Manuel Hoffmann

2

आप एक एक्सटेंशन लिख सकते हैं। मैंने एक बार पहले लिखा था, जैसे कोड बनाने के लिए

if(someObject.stringPropertyX.Equals("abc") || someObject.stringPropertyX.Equals("def") || ....){
    //do something
    ...
}else{
   //do something other...
   ....
}

एक एक्स्टेंशन सेंट के साथ अधिक पठनीय लिखने में सक्षम था

if(someObject.stringPropertyX.In("abc", "def",...,"xyz"){
   //do something
   ...
}else{
  //do something other...
  ....
}

यहाँ कोड है :

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

namespace Some.Namespace.Extenders
{
    public static class StringExtender
    {
        /// <summary>
        /// Evaluates whether the String is contained in AT LEAST one of the passed values (i.e. similar to the "in" SQL clause)
        /// </summary>
        /// <param name="thisString"></param>
        /// <param name="values">list of strings used for comparison</param>
        /// <returns><c>true</c> if the string is contained in AT LEAST one of the passed values</returns>
        public static bool In(this String thisString, params string[] values)
        {
            foreach (string val in values)
            {
                if (thisString.Equals(val, StringComparison.InvariantCultureIgnoreCase))
                    return true;
            }

            return false; //no occurence found
        }
    }
}

यह उस समय मेरी जरूरतों के लिए विशिष्ट है, लेकिन आप इसे और अधिक विभिन्न प्रकारों के मिलान के लिए अनुकूलित और संशोधित कर सकते हैं।


2

0 से 9 के अंकों के लिए:

"123".Contains(myValue)

किसी भी अन्य सामग्री के लिए:

"|1|2|3|".Contains("|" + myValue + "|")

2

अपने अद्यतन किए गए प्रश्न के लिए, आप स्विच-स्टेटमेंट का भी उपयोग कर सकते हैं।

switch (myvalue)
{
   case 1:
   case 2:
   case 3: 
      // your code goes here
  break;
}

1
यही मैंने समाप्त किया। मुझे लगता है कि आम सहमति यह है कि सी # में इसके लिए वास्तव में कोई सुविधा नहीं है।
पॉल माइकल्स

5
मैं वास्तव में इसे स्वीकार नहीं करता, क्योंकि यह "इन" ऑपरेटर प्रश्न का उत्तर नहीं है। इसके बजाय शीर्ष मत वाले उत्तर को देखें ...
chiccodoro

6
मैं इस दृष्टिकोण की सिफारिश नहीं करूंगा! यह स्केलेबल नहीं है और आपके साथी प्रोग्रामर के जीवन को दुखी करने की क्षमता रखता है!
चक्रवात

3
@ डाइसाइक्लोन: हां, यह सभी में स्थिरता के बारे में है। कोड के रूप में अगर आप को बदलने के लिए अगले प्रोग्रामर एक सीरियल किलर है और जानता है कि आप कहाँ रहते हैं।
यह। __ कर्कश_जेक

मैं असहमत हूं, प्रश्न का कोई वास्तविक उत्तर नहीं था (या उत्तर "नहीं, कि C # में मौजूद नहीं है") - तो यह मेरे लिए सबसे निकटतम विकल्प प्रतीत होता था। आपको यह भी ध्यान में रखना होगा कि प्रश्न भाषा की कार्यक्षमता पर आधारित था न कि शैली पर।
पॉल माइकल्स

1

ऑपरेटर में ऐसा कोई भी नहीं है जो किसी संग्रह में एक मूल्य की तलाश करता है, इसके बजाय यह संग्रह की एक विधि है, जिसे कहा जाता है Contains

HashSetसंग्रह के रूप में उपयोग करने के लिए सबसे स्केलेबल समाधान है । एक में मान के लिए जाँच करना HashSetO (1) ऑपरेशन के करीब है, Listजहाँ यह O (n) ऑपरेशन है , वहाँ करने की तुलना में । इसका मतलब है कि आप बहुत सारे मूल्यों को एक में पैक कर सकते हैं HashSetऔर यह अभी भी तेज है, जबकि Listआपके पास जितने अधिक मूल्य हैं, उतने ही धीमी गति से मूल्य की तलाश कर रहे हैं।

उदाहरण:

var set = new HashSet<int>();
set.Add(1);
set.Add(2);
set.Add(3);

var result = items.Select(i => set.Contains(i.value));

1

सामान्य, LINQ तरीका अधिक शक्तिशाली:

var list = new List<string> { "Tomato", "Orange", "Mango"};
var query = from i in my_table
            from v in list
            where i.Name.StartsWith(v)
            select i;

0

inसी # में कीवर्ड के लिए है foreachबयान और LINQ क्वेरी भाव के लिए। inC # प्रति se में SQL के ऑपरेटर के बराबर कोई कार्यक्षमता नहीं है, लेकिन LINQ के साथ समान कार्यक्षमता प्रदान करता है Contains()

var list = {1, 2, 3}
var filtered = (
    from item in items
    where list.Contains(item)
    select item).ToArray().

0

मैं ऐसा कुछ करता हूं:

var shippingAddress = checkoutContext.Addresses.Where(a => (new HashSet<AddressType> { AddressType.SHIPPING_ONLY, AddressType.BILLING_AND_SHIPPING }).Contains(a.AddressType) && a.Id == long.Parse(orderDto.ShippingAddressId)).FirstOrDefault();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.