В 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
c#
sql
operators
in-operator
Пол Майклс
источник
источник
Ответы:
Если вы хотите написать .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... } }
источник
List.Contains()
я думаю то, что вы ищете. C # имеет,in
keyword
а не тот,operator
который служит совершенно другой цели, чем то, о чем вы говорите в SQL.Есть два способа использования
in
ключевого слова в C #. Предположим, у вас есть строка [] или список в 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 }
источник
Обычно вы используете
Contains
метод коллекции.myCollection.Where(p => Enumerable.Range(1,3).Contains(p));
Я надеюсь, что это помогает.
источник
В 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;
источник
Дубликат: LINQ to 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;
источник
Я согласен, что лучший способ реализовать оператор 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");
источник
public static bool In(this string str, params string[] stringSet)
и назовите это как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 } } }
Это тот, который специфичен для моих нужд в то время, но вы можете адаптировать и модифицировать его для соответствия большему количеству разных типов.
источник
Для цифр от 0 до 9:
"123".Contains(myValue)
Для любых других вещей:
"|1|2|3|".Contains("|" + myValue + "|")
источник
Для вашего обновленного вопроса вы также можете использовать оператор-переключатель.
switch (myvalue) { case 1: case 2: case 3: // your code goes here break; }
источник
Нет оператора in, который ищет значение в коллекции, вместо этого это вызываемый метод коллекции
Contains
.Наиболее масштабируемое решение - использовать в
HashSet
качестве коллекции. Проверка значения в aHashSet
близка к операции O (1) по сравнению с выполнением этого в a,List
где это операция O (n). Это означает, что вы можете упаковать много значений в a,HashSet
и это по-прежнему быстро, а поиск значения в aList
будет тем медленнее, чем больше у вас значений.Пример:
var set = new HashSet<int>(); set.Add(1); set.Add(2); set.Add(3); var result = items.Select(i => set.Contains(i.value));
источник
Обычный, 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;
источник
in
Ключевое слово в C # является дляforeach
заявления и выражений запросов LINQ. Функциональности, эквивалентной оператору SQLin
в C # как таковой, нет, но LINQ предлагает аналогичные функции сContains()
.var list = {1, 2, 3} var filtered = ( from item in items where list.Contains(item) select item).ToArray().
источник
Я делаю примерно так:
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();
источник