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


89

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

私はこの私は比較しようとしていたものを明確にするために少しを編集した
ポール・マイケルズ

私が追加した別の回答をチェックしてください
プラナイラナ

これはすでにstackoverflowで複数回要求されています...
chiccodoro

3
@chiccodoroこの質問が以前に尋ねられた場合は、重複としてフラグを付け、元の質問へのリンクを含む回答を投稿してください。否定的なコメントを残さないでください
Hannish

回答:


125

.Inを記述したい場合は、それを可能にする拡張機能を作成できます。

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を使用して追加することを忘れないでください。
Tanner Ornelas、

内容は内容よりも読む方がはるかに優れています...理解しやすい
Konrad

84

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

inC#でキーワードを使用する方法は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<int> checkValues = new List<int> { 1, 2, 3 };

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

4
人々はSQLを見てすぐにLINQにジャンプしますが、この単純な関数はおそらくまさに彼が望んでいるものです
Bart van Heukelom

29

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

var x = 99; // searched value

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

2
同等性チェックを繰り返す代わりにINを実行したいという全体のポイントはコードの複雑さを減らすことであり、これは素晴らしくて短くてシンプルなので、投票数の多いものよりもこの回答を選びました。
MrVimes 2017

1
@MrVimesありがとうございます!
JwJosefy 2018

7

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

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

お役に立てば幸いです。


6

C#には「in」演算子はありません。「in」キーワードは「foreach(... in ...)」または「from ... in ...」でのみ使用されます。

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; 

はい-申し訳ありませんが、質問を編集しました。私が求めていることはlinqとは関係がないためです
ポールマイケルズ

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

この関数でparam-arraysを使用するほうがよいでしょう。いいね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ステートメントを使用することもできます。

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

1
これは私がやったことです。私は、C#にはこれに対する機能は実際にはないというコンセンサスがあると思います。
ポールマイケルズ

5
これは「in」演算子の質問に対する回答ではないため、実際にはこれを受け入れませんでした。代わりに、トップ投票の回答を参照してください...
チッコドロ

6
私はこのアプローチをまったくお勧めしません!それはスケーラブルではなく、あなたの仲間のプログラマーの生活を惨めにする能力を持っています!
デシクロン

3
@decyclone:はい、それはすべて保守性についてです。あなたを置き換える次のプログラマーがシリアルキラーであり、あなたがどこに住んでいるかを知っているかのようにコードを書いてください。
これ。__curious_geek

私は同意しません。質問に対する実際の回答はありませんでした(または、回答は「いいえ、C#には存在しません」でした)。これが私にとって最も近い代替手段であるように思われました。また、質問はスタイルではなく言語の機能に基づいていることにも注意してください。
ポールマイケルズ

1

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

最もスケーラブルなソリューションはHashSet、コレクションとしてを使用することです。aの値をチェックすることは、O(n)操作HashSetであるList場合に比べて、O(1)操作に近いです。つまり、aに多くの値をパックできますが、aで値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

inC#のキーワードは、foreachステートメントとLINQクエリ式用です。inC#自体には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();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.