c# - programacion - operadores logicos en c
¿Hay un operador C#IN? (12)
Acepto que la mejor manera de implementar el operador In es con un Método de extensión. Lo hice un poco diferente:
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;
}
La diferencia es que no tiene que poner comillas alrededor de cada valor, solo el conjunto completo de valores delimitados por comas, que es más fácil de escribir:
bool result = MyString.In("Val1,Val2,Val3");
En SQL, puede usar la siguiente sintaxis:
SELECT *
FROM MY_TABLE
WHERE VALUE_1 IN (1, 2, 3)
¿Hay un equivalente en C #? El IDE parece reconocer "en" como palabra clave, pero parece que no puedo encontrar información sobre él.
Entonces, ¿es posible hacer algo como lo siguiente?
int myValue = 1;
if (myValue in (1, 2, 3))
// Do something
En lugar de
int myValue = 1;
if (myValue == 1 || myValue == 2 || myValue == 3)
// Do something
Duplicado de: LINQ to SQL in y no en
select * from table where fieldname in (''val1'', ''val2'')
o
select * from table where fieldname not in (1, 2)
El equivalente de las consultas IN y NOT IN en LINQ to SQL sería algo como esto:
List<string> validValues = new List<string>() { "val1", "val2"};
var qry = from item in dataContext.TableName
where validValues.Contains(item.FieldName)
select item;
y esto:
List<int> validValues = new List<int>() { 1, 2};
var qry = from item in dataContext.TableName
where !validValues.Contains(item.FieldName)
select item;
La palabra clave in en C # es para la instrucción foreach
y para las expresiones de consulta LINQ. No existe una funcionalidad equivalente al operador de SQL en C # per se, pero LINQ ofrece una funcionalidad similar con Contains()
.
var list = {1, 2, 3}
var filtered = (
from item in items
where list.Contains(item)
select item).ToArray().
No hay ningún operador que busque un valor en una colección, sino que es un método de la colección, llamado Contains
.
La solución más escalable es usar un HashSet
como colección. La comprobación de un valor en un HashSet
está cerca de una operación O (1), en comparación con hacerlo en una List
donde se trata de una operación O (n). Eso significa que puede empaquetar una gran cantidad de valores en un HashSet
y aún así es rápido, mientras que buscar un valor en una List
vuelve más lento HashSet
más valores tenga.
Ejemplo:
var set = new HashSet<int>();
set.Add(1);
set.Add(2);
set.Add(3);
var result = items.Select(i => set.Contains(i.value));
No hay un operador "in" en C #, la palabra clave "in" se usa solo con "foreach (... in ...)" o "from ... in ...".
El equivalente LINQ de su consulta SQL sería:
List<int> list = new List<int> { 1, 2, 3 };
var query = from row in my_table
where list.Contains(row.value1)
select row;
Para dígitos del 0 al 9:
"123".Contains(myValue)
Para cualquier otra cosa:
"|1|2|3|".Contains("|" + myValue + "|")
Para ti pregunta actualizada
hacer uso del interruptor
switch (myvalue)
{
case 1:
case 2:
case 3:
// your code gose here
break;
}
Puedes escribir una extensión Escribí hace un tiempo, por hacer código como
if(someObject.stringPropertyX.Equals("abc") || someObject.stringPropertyX.Equals("def") || ....){
//do something
...
}else{
//do something other...
....
}
más legible con una extensión st uno fue capaz de escribir
if(someObject.stringPropertyX.In("abc", "def",...,"xyz"){
//do something
...
}else{
//do something other...
....
}
Aquí está el code :
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
}
}
}
Este es el específico para mis necesidades en ese momento, pero puede adaptarlo y modificarlo para que coincida con más tipos diferentes.
Puedes hacerlo:
var x = 99; // searched value
if (new[] {1,2,3,99}.Contains(x))
{
// do something
}
Si quisiera escribir .En entonces podría crear una extensión que le permita hacer eso.
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...
}
}
Usualmente usas el método Contains
de una colección.
myCollection.Where(p => Enumerable.Range(1,3).Contains(p));
Espero que ayude.
List.Contains()
es lo que estás buscando. C # tiene una keyword
y no un operator
que tiene un propósito completamente diferente a lo que se refiere en SQL.
Hay dos maneras en que puede usar la palabra clave en C #. Supongamos que tiene una cadena [] o una lista en 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);
}
En referencia a su edición, pondría su código de esta manera para hacer lo que necesita.
int myValue = 1;
List<int> checkValues = new List<int> { 1, 2, 3 };
if (checkValues.Contains(myValue))
// Do something