Есть ли оператор 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
75 голосов | спросил pm_2 2 J000000Friday10 2010, 14:44:44

13 ответов


0

Если вы хотите написать .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...
    }
}
ответил Andy Robinson 2 J000000Friday10 2010, 15:13:43
0

List.Contains() я думаю, что вы ищете. В C # есть in keyword, а не ---- +: = 3 =: + ----, который служит совершенно иным целям, чем то, на что вы ссылаетесь в SQL.

Есть два способа использования ключевого слова operator в C #. Предположим, у вас есть строка [] или список в C #.

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);
        }
ответил this. __curious_geek 2 J000000Friday10 2010, 14:46:02
0

Вы можете сделать это:

var x = 99; // searched value

if (new[] {1,2,3,99}.Contains(x))
{
   // do something
}
ответил JwJosefy 30 PM000000110000000831 2013, 23:42:08
0

В C # нет оператора "in", ключевое слово "in" используется только с "foreach (... in ...)" или "from ... in ...".

LINQ-эквивалент вашего SQL-запроса:

List<int> list = new List<int> { 1, 2, 3 };
var query = from row in my_table
            where list.Contains(row.value1)
            select row;
ответил Daniel 2 J000000Friday10 2010, 14:48:20
0

Обычно вы используете метод Contains для коллекции.

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

Надеюсь, это поможет.

ответил luckyluke 2 J000000Friday10 2010, 14:52:45
0

Дубликат: LINQ для SQL в, а не в

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

или

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

Эквивалент запросов IN и NOT IN в LINQ to SQL будет выглядеть примерно так:

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; 
ответил Pranay Rana 2 J000000Friday10 2010, 14:50:37
0

Я согласен, что лучший способ реализовать оператор 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");
ответил Chuck Bevitt 24 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 24 Sep 2012 23:34:19 +0400 2012, 23:34:19
0

Вы можете написать расширение. Я написал один раз назад, для создания кода, подобного

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

Вот код :

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

Это именно то, что соответствовало моим потребностям в то время, но вы можете адаптировать и модифицировать его для соответствия более различным типам.

ответил Juri 2 J000000Friday10 2010, 15:10:38
0

Для вас обновленный вопрос

используйте переключатель

switch (myvalue)
{
   case 1:
   case 2:
   case 3: 
      // your code gose here
  break;
}
ответил Pranay Rana 2 J000000Friday10 2010, 15:05:23
0

Нет оператора in, который ищет значение в коллекции, вместо этого это метод коллекции, который называется Contains.

Наиболее масштабируемое решение - использовать HashSet в качестве коллекции. Проверка значения в HashSet близка к операции O (1) по сравнению с выполнением в List где это операция O (n). Это означает, что вы можете упаковать много значений в 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));
ответил Guffa 2 J000000Friday10 2010, 15:12:38
0

Для цифр от 0 до 9:

"123".Contains(myValue)

Для любого другого материала:

"|1|2|3|".Contains("|" + myValue + "|")
ответил user3354025 26 FebruaryEurope/MoscowbWed, 26 Feb 2014 06:57:08 +0400000000amWed, 26 Feb 2014 06:57:08 +040014 2014, 06:57:08
0

Ключевое слово in в C # предназначено для foreach и для выражений запросов LINQ. В самом C # нет функциональности, эквивалентной оператору in в SQL, но LINQ предлагает аналогичную функциональность с Contains()

var list = {1, 2, 3}
var filtered = (
    from item in items
    where list.Contains(item)
    select item).ToArray().
ответил P Daddy 2 J000000Friday10 2010, 15:03:45
0

Обычный, более мощный 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;
ответил bjolfr 6 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 06 Sep 2018 21:18:37 +0300 2018, 21:18:37

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132