C # IN operatörü var mı?


91

SQL'de aşağıdaki sözdizimini kullanabilirsiniz:

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

C # 'da bir eşdeğeri var mı? IDE bir anahtar kelime olarak "giriş" i tanıyor gibi görünüyor, ancak bununla ilgili herhangi bir bilgi bulamıyorum.

Öyleyse, aşağıdaki gibi bir şey yapmak mümkün mü:

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

Onun yerine

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

Karşılaştırmaya çalıştığım şeyi açıklığa kavuşturmak için bunu biraz düzenledim
Paul Michaels

benim
tarafımdan

Bu zaten stackoverflow'da birden çok kez soruldu ...
chiccodoro

3
@chiccodoro bu soru daha önce sorulmuşsa, tekrar olarak işaretleyin ve orijinal sorunun bağlantısını içeren bir yanıt gönderin, sadece olumsuz bir yorum bırakmayın
Hannish

Yanıtlar:


128

.In yazmak istiyorsanız, bunu yapmanıza izin veren bir uzantı oluşturabilirsiniz.

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 kullanarak eklemeyi unutmayın;
Tanner Ornelas

İçinde okumak, içerdiğinden çok daha iyi ... Anlaşılması daha kolay
Konrad

85

List.Contains()bence ne arıyorsun? C #, SQL'de bahsettiğinizden tamamen farklı bir amaca hizmet eden in keywordbir operatorşeye sahiptir ve değildir .

inC # 'da anahtar kelimeyi kullanmanın iki yolu vardır . C # 'da bir dizeniz [] veya Listeniz olduğunu varsayın.

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

Düzenlemenize atıfta bulunarak, ihtiyacınız olan şeyi yapmak için kodunuzu bu şekilde koyardım.

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

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

4
İnsanlar SQL'i görür ve anında
LINQ'ya

30

Bunu yapabilirsiniz:

var x = 99; // searched value

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

2
Bu cevabı daha yüksek oy alanlara tercih ettim, çünkü tekrarlanan eşitlik kontrolleri yerine IN yapmak istemenin amacı kod karmaşıklığını azaltmak ve bu güzel, kısa ve basit!
MrVimes

7

Genellikle Containsbir koleksiyon yöntemini kullanırsınız .

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

Umut ediyorum bu yardım eder.


6

C # 'de "in" operatörü yoktur, "in" anahtar sözcüğü yalnızca "foreach (... in ...)" veya "from ... in ..." ile kullanılır.

SQL sorgunuzun LINQ eşdeğeri şöyle olacaktır:

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

4

Yinelenen: LINQ to SQL in and not in

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

veya

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

LINQ to SQL'deki IN ve NOT IN sorgularının eşdeğeri şu şekilde olacaktır:

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

ve bu:

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

Evet - üzgünüm, sorduğum soru linq ile ilgili olmadığı için sorumu düzenledim
Paul Michaels

4

In operatörünü uygulamanın en iyi yolunun Uzatma Yöntemi olduğunu kabul ediyorum. Ben biraz farklı yaptım:

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

Aradaki fark, her bir değerin başına tırnak işareti koymanız gerekmemesi, yalnızca yazması daha kolay olan virgülle ayrılmış değerler kümesinin tamamıdır:

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

Bu işlevle param dizilerini kullanmak olay daha iyi olur. Beğen public static bool In(this string str, params string[] stringSet)ve şöyle arabool result = myString.In("Val1", "Val2", "Val3")
Manuel Hoffmann

2

Bir uzantı yazabilirsiniz. Şunun gibi kod yapmak için bir kez önce yazdım

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

bir uzantı ile daha okunaklı olan biri yazabiliyordu

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

İşte kod :

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

Bu, o zamanki ihtiyaçlarıma özgü olanıdır, ancak daha farklı türlere uyacak şekilde uyarlayabilir ve değiştirebilirsiniz.


2

0 ile 9 arasındaki rakamlar için:

"123".Contains(myValue)

Diğer Öğeler için:

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

2

Güncellenen sorunuz için ayrıca bir anahtar ifadesi de kullanabilirsiniz.

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

1
Sonunda yaptığım şey bu. Sanırım fikir birliği C # 'da bunun için gerçekten herhangi bir kolaylık olmadığı.
Paul Michaels

5
Bunu gerçekten kabul etmezdim, çünkü bu "giriş" operatör sorusunun cevabı DEĞİL. Bunun yerine en çok oylanan yanıtı görün ...
chiccodoro

6
Bu yaklaşımı hiç tavsiye etmem! Ölçeklenebilir değildir ve programcı arkadaşlarınızın hayatlarını perişan etme yeteneğine sahiptir!
decyclone

3
@decyclone: ​​Evet, her şey sürdürülebilirlikle ilgili. sanki sizi değiştirecek bir sonraki programcı bir seri katil ve nerede yaşadığınızı biliyormuş gibi kodlayın.
bu. __curious_geek

Katılmıyorum, sorunun gerçek bir cevabı yoktu (veya cevap "hayır, bu C # 'da yok" idi) - bu yüzden bu bana en yakın alternatif gibi görünüyordu. Sorunun stile değil, dil işlevine dayandığını da unutmamalısınız.
Paul Michaels

1

Bir koleksiyonda bir değer arayan hiçbir operatör yoktur, bunun yerine koleksiyonun adı verilen bir yöntemdir Contains.

En ölçeklenebilir çözüm, HashSetkoleksiyon olarak a kullanmaktır . A'daki bir değeri kontrol etmek, bir O (n) işlemi olduğu HashSetbir Listyerde yapmaya kıyasla O (1) işlemine yakındır . Bu, bir çok değeri bir içine toplayabileceğiniz HashSetve hala hızlı olduğu anlamına gelirken, a'da bir değer ararken, sahip olduğunuz değer Listarttıkça yavaşlar.

Misal:

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

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

1

Yaygın, LINQ çok daha güçlü:

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 # anahtar kelime içindir foreachdeyimi ve LINQ sorgu ifadeleri için. inC # per se'de SQL operatörüne eşdeğer bir işlevsellik yoktur , ancak LINQ Contains(),.

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

0

Bunun gibi bir şey yapıyorum:

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();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.