কোনও সি # আইএন অপারেটর আছে?


91

এসকিউএলে, আপনি নিম্নলিখিত বাক্য গঠন ব্যবহার করতে পারেন:

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

সি # তে সমান কি আছে? আইডিই মনে হয় "ইন" কে একটি কীওয়ার্ড হিসাবে স্বীকৃত করেছে, তবে আমি এটিতে কোনও তথ্য খুঁজে পাব বলে মনে হয় না।

সুতরাং, নীচের মতো কিছু করা কি সম্ভব:

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

পরিবর্তে

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

আমি কী তুলনা করার চেষ্টা করছিলাম তা স্পষ্ট করার জন্য আমি এটি সম্পাদনা করেছি
পল মাইকেলস

আমার দ্বারা যুক্ত করা আরও একটি উত্তর চেক করুন
প্রণয় রানা

এটি ইতিমধ্যে
স্ট্যাকওভারফ্লোতে

4
@ শিক্কোডোরো যদি এই প্রশ্ন জিজ্ঞাসা করার আগে জিজ্ঞাসা করা হয় তবে এটি সদৃশ হিসাবে পতাকাঙ্কিত করুন এবং মূল প্রশ্নের লিঙ্কটি দিয়ে একটি উত্তর পোস্ট করুন, কেবল একটি নেতিবাচক মন্তব্য করবেন না
হ্যানিশ

উত্তর:


128

আপনি যদি লিখতে চেয়েছিলেন .তখন আপনি একটি এক্সটেনশন তৈরি করতে পারেন যা আপনাকে এটি করতে দেয়।

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...
    }
}

4
শুধু System.Linq ব্যবহার করে যুক্ত মনে রাখবেন;
ট্যানার অরনেলাস

অন্তর্ভুক্তগুলি পড়ার চেয়ে পড়ার চেয়ে আরও ভাল ... বোঝার জন্য আরও সহজ
কনরাড

85

List.Contains()আপনি কি খুঁজছেন আমি কি মনে করি? সি # এর রয়েছে in keywordএবং এটি operatorসম্পূর্ণরূপে ভিন্ন উদ্দেশ্যে কাজ করে না তবে আপনি কী এসকিউএল উল্লেখ করছেন।

inআপনি সি # তে কীওয়ার্ডটি ব্যবহার করতে পারেন এমন দুটি উপায় রয়েছে । ধরুন আপনার কাছে একটি স্ট্রিং [] বা সি # তে তালিকা রয়েছে।

        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
লোকেরা এসকিউএল দেখতে পায় এবং তাত্ক্ষণিকভাবে লিনকিউতে ঝাঁপিয়ে পড়ে, তবে এই সাধারণ কাজটি সম্ভবত তিনি যা চান তা সম্ভবত
বার্ট ভ্যান হিউকেলাম

30

তুমি এটি করতে পারো:

var x = 99; // searched value

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

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

7

আপনি সাধারণত Containsসংগ্রহের পদ্ধতিটি ব্যবহার করেন ।

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

আমি আসা করি এটা সাহায্য করবে.


6

সি # তে "অপারেটর" নেই, "ইন" কিওয়ার্ডটি কেবল "ফোরচ (... ইন ...)" বা "থেকে ... ইন ..." ব্যবহার করা হয়।

আপনার এসকিউএল ক্যোয়ারির লিনকিউ সমমান হবে:

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

4

এর সদৃশ: এসকিউএল-তে লাইনকিউ ইন এবং নেই

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

বা

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

লিংকউ-তে এসকিউএল-এ প্রশ্নের উত্তরগুলি নয় এবং এর সমতুল্য কিছু হবে:

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

আমি সম্মত হচ্ছি ইন অপারেটর বাস্তবায়নের সেরা উপায়টি একটি এক্সটেনশন পদ্ধতি সহ with আমি এটি কিছুটা ভিন্নভাবে করেছি:

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")
ম্যানুয়েল হফম্যান

2

আপনি একটি এক্সটেনশন লিখতে পারেন। কোডটি তৈরি করার জন্য আমি একবার লিখেছিলাম wrote

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

4
এটিই আমি শেষ করেছিলাম। আমি মনে করি যে sensক্যমত্যটি হ'ল সি # তে এর জন্য সত্যিই কোনও সুবিধা নেই।
পল মাইকেলস 11

4
আমি সত্যিই এটি গ্রহণ করতাম না, কারণ এটি "ইন" অপারেটর প্রশ্নের কোনও উত্তর নয়। পরিবর্তে শীর্ষ-ভোট দেওয়া উত্তরটি দেখুন ...
চিককডোরো

6
আমি এই পদ্ধতির মোটেও সুপারিশ করব না! এটি স্কেলযোগ্য নয় এবং আপনার সহকারী প্রোগ্রামারদের জীবনকে দুর্বিষহ করে তোলার ক্ষমতা রাখে!
ডেস্কলোন

4
@ ডেসাইক্লোন: হ্যাঁ, এটি রক্ষণাবেক্ষণের বিষয়ে about কোডটি যেন আপনাকে প্রতিস্থাপন করার জন্য পরবর্তী প্রোগ্রামার একটি সিরিয়াল-হত্যাকারী এবং আপনি কোথায় থাকেন জানেন।
এই __curious_geek

আমি একমত নই, প্রশ্নের সত্যিকারের কোনও উত্তর নেই (বা উত্তরটি "না, এটি সি # তে নেই") তাই এটি আমার নিকটতম বিকল্প বলে মনে হয়েছিল। আপনার মনে রাখতে হবে যে প্রশ্নটি ভাষা কার্যকারিতার উপর ভিত্তি করে নয় স্টাইলের উপর ভিত্তি করে।
পল মাইকেলস 13

1

কোনও সংগ্রহে কোনও অপারেটর নেই যা সংগ্রহের জন্য মূল্য সন্ধান করে, পরিবর্তে এটি সংগ্রহের একটি পদ্ধতি, যাকে বলে Contains

সর্বাধিক স্কেলেবল সমাধান হ'ল HashSetসংগ্রহ হিসাবে একটি ব্যবহার করা । কোনও ও (এন) অপারেশন যেখানে এটি HashSetকরার সাথে তুলনা করে একটি এর মধ্যে একটি মান পরীক্ষা করা ও (1 List) অপারেশনের কাছাকাছি। এর অর্থ হ'ল আপনি একটিতে প্রচুর মান প্যাক করতে পারেন 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

সাধারণ, লিনকুই উপায় আরও শক্তিশালী:

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

inC # শব্দ জন্য foreachবিবৃতি এবং LINQ ক্যোয়ারী এক্সপ্রেশন জন্য। inপ্রতি # সি তে এসকিউএল অপারেটরের সমতুল্য কোনও কার্যকারিতা নেই তবে লিনকিউ এর সাথে অনুরূপ কার্যকারিতা সরবরাহ করে 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();
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.