75


10

C#IN演算子はありますか?

SQLでは、次の構文を使用できます。

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

C#にも同等のものはありますか? IDEは「in」をキーワードとして認識しているように見えますが、その情報を見つけることができないようです。

だから、次のようなことをすることは可能ですか?

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

の代わりに

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

13 Answer


104


Inを書きたい場合は、それを可能にする拡張機能を作成できます。
static class Extensions
{

    public static bool In(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...
    }
}


77


`List.Contains()`はあなたが探しているものだと思います。 C#には、「in」「keyword」があり、SQLで参照しているものとはまったく異なる目的を果たす「operator」はありません。

C#で `in`キーワードを使用するには2つの方法があります。 C#にstring []またはListがあると仮定します。

        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 checkValues = new List { 1, 2, 3 };

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


20


あなたはこれを行うことができます:

var x = 99; // searched value

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


6


C#には「in」演算子はありません。「in」キーワードは「foreach(…​ in …​)」または「from …​ で…​」。

SQLクエリに相当するLINQは次のようになります。

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


6


通常、コレクションの `Contains`メソッドを使用します。

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

助けになれば幸いです。


4


複製:https://stackoverflow.com/questions/3047657/linq-to-sql-in-and-not-in[LINQ to SQL inおよびnot in]

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

or

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

LINQ to SQLのINおよびNOT INクエリに相当するものは次のようになります。

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

この:

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


4


In演算子を実装する最良の方法は、拡張メソッドを使用することです。 私は少し違ったやり方をしました:

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


2


拡張機能を作成できます。 次のようなコードを作成するために、私は一度書いた

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

拡張s.tでより読みやすくなります。 書くことができた

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

codeは次のとおりです。

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

namespace Some.Namespace.Extenders
{
    public static class StringExtender
    {
        ///
        /// Evaluates whether the String is contained in AT LEAST one of the passed values (i.e. similar to the "in" SQL clause)
        ///
        ///
        /// list of strings used for comparison
        /// true if the string is contained in AT LEAST one of the passed values
        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
        }
    }
}

これは当時の私のニーズに固有のものでしたが、より多くの異なるタイプに合わせて調整および変更することができます。


1


更新された質問には、switch-statementも使用できます。

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


1


コレクション内の値を検索するin演算子はありません。代わりに、 `Contains`と呼ばれるコレクションのメソッドです。

最もスケーラブルなソリューションは、コレクションとして「HashSet」を使用することです。 HashSet`で値をチェックすることは、O(n)操作である List`で行うことに比べて、O(1)操作に近いです。 つまり、 HashSet`に多くの値をパックできますが、それでも高速ですが、 List`の値を探すと、値が増えるほど遅くなります。

例:

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

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