Есть ли оператор 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 ответов
Если вы хотите написать .В этом случае вы можете создать расширение, которое позволит вам это сделать.
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...
}
}
List.Contains()
Я думаю, что вы ищете. В C#in
keyword
, а не operator
который служит совершенно другой цели, чем то, что вы имеете в виду в SQL.
есть два способа использовать in
ключевое слово в C#. Предположим, у вас есть строка[] или List в C#.
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
вы можете сделать это:
var x = 99; // searched value
if (new[] {1,2,3,99}.Contains(x))
{
// do something
}
в C# нет оператора" in", ключевое слово" in "используется только с" foreach (... в...)" или "от ... в...".
эквивалент 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;
вы обычно используете Contains
метод сбора.
myCollection.Where(p => Enumerable.Range(1,3).Contains(p));
надеюсь, это поможет.
копия : LINQ to SQL В и не в
select * from table where fieldname in ('val1', 'val2')
или
select * from table where fieldname not in (1, 2)
эквивалент IN, а не 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;
Я согласен, что лучший способ реализовать оператор 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");
вы можете написать расширение. Я написал один раз назад, для создания кода, как
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
}
}
}
Это один специфический для моих потребностей в то время, но вы можете адаптировать и модифицировать его, чтобы соответствовать более различным типам.
для вас обновленный вопрос
используйте переключатель
switch (myvalue)
{
case 1:
case 2:
case 3:
// your code gose here
break;
}
нет оператора 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));
для цифр от 0 до 9:
"123".Contains(myValue)
для любого другого материала:
"|1|2|3|".Contains("|" + myValue + "|")
на in
ключевое слово в C# для foreach
оператор и для выражений запроса LINQ. Нет функциональности, эквивалентной SQL in
оператор в C# per se, но LINQ предлагает аналогичную функциональность с Contains()
.
var list = {1, 2, 3}
var filtered = (
from item in items
where list.Contains(item)
select item).ToArray().
Common, 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;