¿Cómo verifico si un valor está en una matriz en C #?
Quiero crear una matriz con una lista de nombres de impresoras.
Estos se enviarán a un método, que examinará cada cadena a su vez, y si la cadena es igual que un valor en una matriz, realice esa acción.
Por ejemplo:
string[] printer = {"jupiter", "neptune", "pangea", "mercury", "sonic"};
foreach (p in printer)
{
PrinterSetup(p);
}
Estos son los nombres de las impresoras, que se alimentan al método PrinterSetup.
PrinterSetup se verá así (un pseudocódigo):
public void PrinterSetup(printer)
{
if (printer == "jupiter")
{
Process.Start("BLAH BLAH CODE TO ADD PRINTER VIA WINDOWS EXEC");
}
}
¿Cómo puedo formatear if (printer == "jupiter")
de una manera que C # pueda reconocer?
printer.Equals("jupiter")
. Si es el primero, uselinq
yprinter.Contains("jupiter")
printer.Equals("jupiter")
... El código del OPif (printer == "jupiter")
funciona bien ... siempre queprinter
se declare que es una cadena, como señala Skeet.Respuestas:
Agregar el espacio de nombres necesario
Entonces puedes usar el
Contains()
método linqfuente
How do I check if a value is in an array in C#?
) y también eficiente. Sin bucle, sin método adicional. Solo un espacio de nombres es un extra, lo cual no es gran cosa.((IList)printer).Contains("Jupiter")
que no es genérico (puede incluir tipos de valores de caja, etc.) y funciona incluso para matrices multidimensionales. Y desde .NET 2.0 tenemos el más mágico((IList<string>)printer).Contains("Jupiter")
que es más seguro para los tipos. El enfoque de Linq era nuevo en .NET 3.5.1) Verdadero 2) Falso 3) Verdadero 4) Falso
fuente
fuente
¿Algo como esto?
fuente
fuente
a
es una matriz multidimensional (comonew string[10, 20, 15]
por ejemplo), con una excepción. También fallará con matrices unidimensionales que no están indexadas desde cero (comoArray.CreateInstance(typeof(string), new[] { 5, }, new[] { -2, })
, raro en C #, lo admito), con un valor de retorno posiblemente incorrecto. Estas deficiencias son fáciles de solucionar con genéricos:public static bool Contains<TElement>(TElement[] a, TElement val) { return Array.IndexOf(a, val) != -1; }
Nota: La pregunta es sobre matrices de cadenas. Las rutinas mencionadas no se deben mezclar con el método .Contains de cadenas individuales.
Me gustaría agregar una respuesta extendida que se refiera a diferentes versiones de C # y por dos razones:
La respuesta aceptada requiere Linq, que es C # perfectamente idiomático, mientras que no viene sin costos y no está disponible en C # 2.0 o inferior. Cuando se trata de una matriz, el rendimiento puede ser importante, por lo que hay situaciones en las que desea permanecer con los métodos de matriz.
Ninguna respuesta atiende directamente a la pregunta en la que también se pidió que pusiera esto en una función (como algunas respuestas también mezclan cadenas con matrices de cadenas, esto no es completamente insignificante).
Array.Exists () es un método C # / .NET 2.0 y no necesita Linq. La búsqueda en matrices es O (n). Para un acceso aún más rápido, use HashSet o colecciones similares.
Desde .NET 3.5 también existe un método genérico
Array<T>.Exists()
:Puede escribir un método de extensión propio (C # 3.0 y superior) para agregar el azúcar sintáctico para obtener el mismo / similar ".Contains" que para las cadenas para todas las matrices sin incluir Linq:
En este caso
ArrayContains()
se utiliza este método y no el método Contiene de Linq.Los métodos .Contains mencionados en otra parte se refieren a
List<T>.Contains
(desde C # 2.0) oArrayList.Contains
(desde C # 1.1), pero no directamente a las matrices.fuente
Simplemente te falta algo en tu método:
Solo agregue
string
y estará bien.fuente
No está muy claro cuál es su problema, pero parece que quiere algo como esto:
fuente
Considere usar
HashSet<T>
Class por el bien del rendimiento de búsqueda:Por ejemplo:
fuente
Busqué ahora durante 2 horas para encontrar una manera agradable de encontrar duplicados en una lista y cómo eliminarlos . Aquí está la respuesta más simple:
La salida se verá así: ¡Los elementos duplicados se eliminarán en la nueva lista llamada distinta!
fuente