Comprobando si una matriz de cadenas contiene un valor, y si es así, obteniendo su posición

163

Tengo esta serie de cadenas:

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";

Me gustaría determinar si stringArraycontiene value. Si es así, quiero ubicar su posición en la matriz.

No quiero usar bucles. ¿Alguien puede sugerir cómo podría hacer esto?

MoShe
fuente

Respuestas:

317

Puede usar el método Array.IndexOf :

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";
int pos = Array.IndexOf(stringArray, value);
if (pos > -1)
{
    // the array contains the string and the pos variable
    // will have its position in the array
}
Darin Dimitrov
fuente
1
... Y he estado usando foreach durante meses. Por cierto, ¿esto es computacionalmente más rápido que la respuesta de BLUEPIXY? O más lento?
Max von Hippel
2
¿Le Array.IndexOfimporta la capitalización? Hace "text1" == "TEXT1"?
MAL
Array.IndexOf−1solo se devuelve si el índice tiene un límite de 0. Este caso se rompería, ¡así que ten cuidado! var a = Array.CreateInstance(typeof(int),new int[] { 2 }, new int[] { 1 }); a.SetValue(1, 1); Console.WriteLine(Array.IndexOf(a, 26)); // 0
benscabbia
Esto es útil si está buscando una coincidencia exacta. Sin embargo, esto podría ser útil si no le importa el caso: cómo agregar una opción que distinga entre mayúsculas y minúsculas a Array.IndexOf
Kyle Champion
72
var index = Array.FindIndex(stringArray, x => x == value)
BLUEPIXY
fuente
77
Esta debería ser la respuesta aceptada porque permite pasar una lambda para hacer cosas más complicadas como Array.FindIndex (array, x => x.StartsWith ("insert string here"))
reggaeguitar
1
Pero eso no es lo que pide la pregunta. La pregunta se pregunta cómo encuentra un valor conocido de una matriz.
Karl Gjertsen
2
@KarlGjertsen Quiero ubicar su posición en la matriz
BLUEPIXY
Sin embargo, esto es muy útil, poder hacer algo como x.ToUpper () fue bastante beneficioso para mí.
mrshickadance
31

También podemos usar Exists:

string[] array = { "cat", "dog", "perl" };

// Use Array.Exists in different ways.
bool a = Array.Exists(array, element => element == "perl");
bool c = Array.Exists(array, element => element.StartsWith("d"));
bool d = Array.Exists(array, element => element.StartsWith("x"));
Taran
fuente
1
Respuesta limpia y simple
Aryan Firouzian
¿Cómo verifico los valores individuales? Cuando traté de comprobación de una matriz de caracteres para un char, tengo un mensaje que charno se puede convertir enSystem.Predicate<char>
Aaron Franke
13

EDITAR: No me había dado cuenta de que también necesitabas el puesto. No se puede usar IndexOfdirectamente en un valor de un tipo de matriz, porque está implementado explícitamente. Sin embargo, puedes usar:

IList<string> arrayAsList = (IList<string>) stringArray;
int index = arrayAsList.IndexOf(value);
if (index != -1)
{
    ...
}

(Esto es similar a llamar Array.IndexOfsegún la respuesta de Darin, solo un enfoque alternativo. No me queda claro por qué se implementa explícitamente en matrices, pero no importa ...)IList<T>.IndexOf

Jon Skeet
fuente
¿Cómo encuentro la posición del mundo en la matriz usando Contains?
MoShe
¿Existe la posibilidad de verificar que un elemento de cadena en la matriz de cadenas A exista en otra matriz de cadenas B?
Murali Murugesan
@MuraliMurugesan: No está claro lo que preguntas - si las dos matrices tienen ningún elementos en común? ¿Un artículo específico ? (En el último caso, el hecho de que también esté en una matriz es irrelevante)
Jon Skeet
Estaba tratando de responder aquí stackoverflow.com/a/22812525/1559213 . Golpeé para devolver verdadero / falso para la línea Html.CheckBox. En realidad, hay una serie de meses y también el modelo que tiene algunos meses. Si el mes modelo está presente en la matriz de meses, debemos devolver verdadero. Gracias por la respuesta del cohete :)
Murali Murugesan
@MuraliMurugesan: Bueno, eso suena comoif (months.Contains(model.Month))
Jon Skeet
5

Puede usar Array.IndexOf(): tenga en cuenta que devolverá -1 si no se ha encontrado el elemento y tiene que manejar este caso.

int index = Array.IndexOf(stringArray, value);
Vidrio roto
fuente
4

puede intentar de esta manera ... puede usar Array.IndexOf (), si desea conocer la posición también

       string [] arr = {"One","Two","Three"};
       var target = "One";
       var results = Array.FindAll(arr, s => s.Equals(target));
Estado enigma
fuente
3

En mi opinión, la mejor manera de verificar si una matriz contiene un valor dado es usar el System.Collections.Generic.IList<T>.Contains(T item)método de la siguiente manera:

((IList<string>)stringArray).Contains(value)

Ejemplo de código completo:

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";
if (((IList<string>)stringArray).Contains(value)) Console.WriteLine("The array contains "+value);
else Console.WriteLine("The given string was not found in array.");

T[]Las matrices implementan de forma privada algunos métodos List<T>, como Count and Contains. Debido a que es una implementación explícita (privada), no podrá usar estos métodos sin convertir primero la matriz. Esto no solo funciona para cadenas: puede usar este truco para verificar si una matriz de cualquier tipo contiene algún elemento, siempre que la clase del elemento implemente IComparable.

Tenga en cuenta que no todos los IList<T>métodos funcionan de esta manera. Intentar usar IList<T>el método Add en una matriz fallará.

pKami
fuente
2
La suya es básicamente la misma respuesta que la de Priyank. No da el índice del elemento que es lo que pedía el OP.
reggaeguitar
@reggaeguitar De acuerdo contigo!
Si8
Es la solución que estaba buscando, aunque no responde completamente la pregunta.
Auspex
1

Puede intentar esto, busca el índice que contiene este elemento y establece el número de índice como int, luego comprueba si int es mayor que -1, por lo que si es 0 o más, significa que encontró un índice, ya que las matrices están basadas en 0.

string[] Selection = {"First", "Second", "Third", "Fourth"};
string Valid = "Third";    // You can change this to a Console.ReadLine() to 
    //use user input 
int temp = Array.IndexOf(Selection, Valid); // it gets the index of 'Valid', 
                // in our case it's "Third"
            if (temp > -1)
                Console.WriteLine("Valid selection");
            }
            else
            {
                Console.WriteLine("Not a valid selection");
            }
Mayer Spitzer
fuente
0
string x ="Hi ,World";
string y = x;
char[] whitespace = new char[]{ ' ',\t'};          
string[] fooArray = y.Split(whitespace);  // now you have an array of 3 strings
y = String.Join(" ", fooArray);
string[] target = { "Hi", "World", "VW_Slep" };

for (int i = 0; i < target.Length; i++)
{
    string v = target[i];
    string results = Array.Find(fooArray, element => element.StartsWith(v, StringComparison.Ordinal));
    //
    if (results != null)
    { MessageBox.Show(results); }

}
usuario5248404
fuente
0

Creé un método de extensión para reutilizar.

   public static bool InArray(this string str, string[] values)
    {
        if (Array.IndexOf(values, str) > -1)
            return true;

        return false;
    }

Cómo llamarlo:

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";
if(value.InArray(stringArray))
{
  //do something
}
james31rock
fuente
¿Dónde está el positionque solicita el OP?
Si8
-3
string[] strArray = { "text1", "text2", "text3", "text4" };
string value = "text3";

if(Array.contains(strArray , value))
{
    // Do something if the value is available in Array.
}
Jaydeep Bhatt
fuente
Da error: 'System.Array' no contiene una definición para 'contiene'.
ePandit
-4

El método más simple y más corto sería el siguiente.

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";

if(stringArray.Contains(value))
{
    // Do something if the value is available in Array.
}
Priyank Gajera
fuente
3
La pregunta era sobre encontrar la posición de un elemento en una matriz ... Con el Containsmétodo no tienes esta información
Bidou