C # IN 연산자가 있습니까?


90

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

나는 비교하려고했던 것을 명확히하기 위해 이것을 약간 편집했습니다
Paul Michaels

나를 추가 한 다른 답변 확인
Pranay라나

이것은 이미 ... 유래에 여러 번 요청되었습니다
chiccodoro

3
이 질문에 중복으로 다음 플래그 전에 물어 원래의 질문에 대한 링크와 함께 답변을 게시하고있다 @chiccodoro 경우, 단지 부정적인 코멘트 떠나 지마
Hannish

답변:


127

.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

In은 포함하는 것보다 읽는 것이 훨씬 낫습니다 ... 이해하기 더
Konrad

84

List.Contains()나는 당신이 찾고있는 것을 생각합니다. C #은이 in keyword아닌operator 당신이 SQL에서 참조하는지 다음 완전히 다른 목적을 제공하는합니다.

inC #에서 키워드를 사용하는 방법에는 두 가지가 있습니다 . 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 2010

30

다음과 같이 할 수 있습니다.

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

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 in and not in

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와 관련이 없기 때문에 질문을 수정했습니다
Paul Michaels

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")
마누엘 호프만

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-statement를 사용할 수도 있습니다.

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

1
이것이 내가 한 일입니다. 나는 C #에서 이것에 대한 시설이 실제로 없다는 것이 합의라고 생각합니다.
Paul Michaels

5
"in"연산자 질문에 대한 대답이 아니기 때문에 나는 이것을 받아들이지 않았을 것입니다. 대신 최고 투표 답변보기 ...
chiccodoro 2010-07-02

6
이 접근 방식을 전혀 권장하지 않습니다! 확장 가능하지 않으며 동료 프로그래머의 삶을 비참하게 만드는 능력이 있습니다!
decyclone

3
@decyclone : 예, 유지 관리에 관한 것입니다. 당신을 대체 할 다음 프로그래머가 연쇄 살인범이고 당신이 사는 곳을 아는 것처럼 코딩하십시오.
이. __curious_geek

동의하지 않습니다. 질문에 대한 실제 답변이 없었습니다 (또는 대답은 "아니요, C #에 존재하지 않습니다"). 그래서 이것은 나에게 가장 가까운 대안으로 보였습니다. 또한 질문은 스타일이 아닌 언어 기능에 기반을두고 있다는 점을 명심해야합니다.
Paul Michaels

1

컬렉션에서 값을 찾는 in 연산자는 없습니다. 대신라는 컬렉션의 메서드입니다 Contains.

가장 확장 가능한 솔루션은 a HashSet를 컬렉션 으로 사용하는 것입니다. a에서 값을 확인하는 것은 a에서 HashSet수행하는 것과 비교하여 O (1) 작업에 가깝습니다.List O (n) 연산 인 . 즉, 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.