Verificando se uma matriz de cadeias contém um valor e, se houver, obtendo sua posição


162

Eu tenho essa matriz de seqüência de caracteres:

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

Eu gostaria de determinar se stringArraycontém value. Nesse caso, quero localizar sua posição na matriz.

Eu não quero usar loops. Alguém pode sugerir como eu posso fazer isso?

Respostas:


316

Você pode usar o 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
}

1
... E eu tenho usado foreach por meses. BTW é computacionalmente mais rápido que a resposta do BLUEPIXY? Ou mais devagar?
Max von Hippel

2
Se Array.IndexOfimporta com capitalização? Faz "text1" == "TEXT1"?
MAU

Array.IndexOfretorna −1somente se o índice for delimitado por 0. Este caso iria quebrar, então esteja ciente! var a = Array.CreateInstance(typeof(int),new int[] { 2 }, new int[] { 1 }); a.SetValue(1, 1); Console.WriteLine(Array.IndexOf(a, 26)); // 0
benscabbia

Isso é útil se você estiver procurando uma correspondência exata. No entanto, isso pode ser útil se você não se importa sobre o caso: Como adicionar uma opção de maiúsculas e minúsculas para Array.indexOf
Kyle Campeão

72
var index = Array.FindIndex(stringArray, x => x == value)

7
Essa deve ser a resposta aceita, pois permite que você passe um lambda para fazer coisas mais complicadas, como Array.FindIndex (array, x => x.StartsWith ("insert string here"))
reggaeguitar

1
Mas não é isso que a pergunta está pedindo. A pergunta pergunta como você encontra um valor conhecido de uma matriz.
Karl Gjertsen

2
@KarlGjertsen Quero localizar sua posição na matriz #
BLUEPIXY

Isso é muito útil, porém, poder fazer algo como um x.ToUpper () foi muito benéfico para mim.
mrshickadance

31

Também 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"));

1
Resposta simples e limpa
Aryan Firouzian

Como verifico valores individuais? Quando tentei verificar uma matriz de caracteres, recebi uma mensagem que charnão pode ser convertida emSystem.Predicate<char>
Aaron Franke

13

Edição: Eu não tinha notado que você precisava da posição também. Você não pode usar IndexOfdiretamente em um valor de um tipo de matriz, porque é implementado explicitamente. No entanto, você pode usar:

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

(Isso é semelhante a chamar de Array.IndexOfacordo com a resposta de Darin - apenas uma abordagem alternativa. Não está claro para mim por que é implementado explicitamente em matrizes, mas não importa ...)IList<T>.IndexOf


como encontro a possessão do mundo na matriz usando Contains?
Moshe

Existe a possibilidade de verificar se um item de string na matriz A existe em outra matriz B?
Murali Murugesan

@MuraliMurugesan: Não está claro o que você está perguntando - se as duas matrizes têm algum item em comum? Um item específico ? (Neste último caso, o facto de que é também em uma matriz é irrelevante.)
Jon tiro ao prato

Eu estava tentando responder aqui stackoverflow.com/a/22812525/1559213 . Comecei a retornar true / false para a linha Html.CheckBox. Na verdade, há uma matriz de meses e também o modelo que tem alguns meses. Se Model month estiver presente na matriz de meses, precisamos retornar true. Obrigado por resposta foguete :)
Murali Murugesan

@MuraliMurugesan: Bem, isso soa comoif (months.Contains(model.Month))
Jon Skeet /

5

Você pode usar Array.IndexOf()- observe que ele retornará -1 se o elemento não tiver sido encontrado e você tiver que lidar com este caso.

int index = Array.IndexOf(stringArray, value);

4

você pode tentar assim ... você pode usar Array.IndexOf (), se você quiser conhecer a posição também

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

3

A melhor maneira de verificar se uma matriz contém um determinado valor é usar o System.Collections.Generic.IList<T>.Contains(T item)método da seguinte maneira:

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

Exemplo 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[]matrizes implementam privadamente alguns métodos de List<T>, como Count e Contains. Por ser uma implementação explícita (privada), você não poderá usar esses métodos sem lançar a matriz primeiro. Isso não funciona apenas para strings - você pode usar este truque para verificar se uma matriz de qualquer tipo contém algum elemento, desde que a classe do elemento implemente IComparable.

Lembre-se de que nem todos os IList<T>métodos funcionam dessa maneira. A tentativa de usar IList<T>o método Add em uma matriz falhará.


2
A sua é basicamente a mesma resposta que a de Priyank. Não fornece o índice do elemento que o OP estava pedindo.
Reggaeguitar #

@reggaeguitar Concordo com você lá!
Si8

É a solução que eu estava procurando, mesmo que não responda completamente à pergunta.
Auspex

1

Você pode tentar isso, procura o índice que contém esse elemento e define o número do índice como int; depois, verifica se o int é maior que -1; portanto, se é 0 ou mais, significa que encontrou um índice - como matrizes são baseadas em 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");
            }

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); }

}

0

Eu criei um método de extensão para reutilização.

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

        return false;
    }

Como chamá-lo:

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";
if(value.InArray(stringArray))
{
  //do something
}

Onde está o positionque o OP está pedindo?
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.
}

Dá o erro: 'System.Array' não contém uma definição para 'contém'.
ePandit

-4

O método mais simples e mais curto seria o seguinte.

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

if(stringArray.Contains(value))
{
    // Do something if the value is available in Array.
}

3
A pergunta era sobre como encontrar a posição de um item em uma matriz .... Com o Containsmétodo você não tem essas informações #
1846
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.