Como posso verificar se um valor está em uma matriz em C #?
Tipo, eu quero criar um array com uma lista de nomes de impressoras.
Eles serão alimentados para um método, que examinará cada string por vez, e se a string for igual a um valor em um array, faça essa ação.
Por exemplo:
string[] printer = {"jupiter", "neptune", "pangea", "mercury", "sonic"};
foreach (p in printer)
{
PrinterSetup(p);
}
Esses são os nomes das impressoras, eles estão sendo alimentados pelo método PrinterSetup.
PrinterSetup será mais ou menos assim (algum pseudocódigo):
public void PrinterSetup(printer)
{
if (printer == "jupiter")
{
Process.Start("BLAH BLAH CODE TO ADD PRINTER VIA WINDOWS EXEC");
}
}
Como faço para formatar if (printer == "jupiter")
de uma maneira que o C # possa reconhecer?
printer.Equals("jupiter")
. Se for o primeiro, uselinq
eprinter.Contains("jupiter")
printer.Equals("jupiter")
... O código do OPif (printer == "jupiter")
funciona muito bem ... desde queprinter
seja declarado como uma string, como observa Skeet.Respostas:
Adicione o namespace necessário
Então você pode usar o
Contains()
método linqfonte
How do I check if a value is in an array in C#?
) e também eficiente. Sem loop, nenhum método extra. Apenas um namespace é extra, o que não é grande coisa.((IList)printer).Contains("Jupiter")
que é não genérico (pode incluir tipos de valor, etc.) e funciona até mesmo para arrays multidimensionais. E desde o .NET 2.0, temos o mais mágico,((IList<string>)printer).Contains("Jupiter")
que é mais seguro para tipos. A abordagem do Linq era nova no .NET 3.5.1) Verdadeiro 2) Falso 3) Verdadeiro 4) Falso
fonte
fonte
Algo assim?
fonte
fonte
a
for uma matriz multidimensional (comonew string[10, 20, 15]
por exemplo), com uma exceção. Ele também falhará com matrizes unidimensionais que não são indexadas a partir de zero (comoArray.CreateInstance(typeof(string), new[] { 5, }, new[] { -2, })
, raro em C #, admito), com um valor de retorno possivelmente errado. Essas deficiências são fáceis de corrigir com genéricos:public static bool Contains<TElement>(TElement[] a, TElement val) { return Array.IndexOf(a, val) != -1; }
Nota: a questão é sobre matrizes de strings. As rotinas mencionadas não devem ser misturadas com o método .Contains de strings únicas.
Eu gostaria de adicionar uma resposta extensa referindo-se a diferentes versões C # e por dois motivos:
A resposta aceita requer Linq, que é perfeitamente idiomático C #, embora não venha sem custos e não esteja disponível em C # 2.0 ou inferior. Quando um array está envolvido, o desempenho pode ser importante, portanto, há situações em que você deseja permanecer com os métodos Array.
Nenhuma resposta atende diretamente à pergunta onde foi solicitado também colocar isso em uma função (como algumas respostas também misturam strings com matrizes de strings, isso não é completamente sem importância).
Array.Exists () é um método C # /. NET 2.0 e não precisa de Linq. Pesquisar em matrizes é O (n). Para um acesso ainda mais rápido, use HashSet ou coleções semelhantes.
Desde .NET 3.5 também existe um método genérico
Array<T>.Exists()
:Você poderia escrever um método de extensão próprio (C # 3.0 e superior) para adicionar o açúcar sintático para obter o mesmo / semelhante ".Contains" como para strings para todos os arrays sem incluir Linq:
Neste caso, este
ArrayContains()
método é usado e não o método Contains do Linq.Os outros métodos mencionados .Contains referem-se a
List<T>.Contains
(desde C # 2.0) ouArrayList.Contains
(desde C # 1.1), mas não a arrays diretamente.fonte
Você está simplesmente perdendo algo em seu método:
Basta adicionar
string
e você ficará bem.fonte
Não está muito claro qual é o seu problema, mas parece que você quer algo assim:
fonte
Considere o uso de
HashSet<T>
Class para o desempenho da pesquisa:Por exemplo:
fonte
Pesquisei agora por 2h para encontrar uma maneira agradável de encontrar duplicatas em uma lista e como removê-las . Aqui está a resposta mais simples:
A saída terá a seguinte aparência: Elementos duplicados serão removidos da nova lista chamada distintos!
fonte