Mais sucinto, de forma a determinar se uma variável é igual a um valor de uma lista de valores

StackOverflow https://stackoverflow.com/questions/18407

  •  09-06-2019
  •  | 
  •  

Pergunta

Se eu tiver uma variável em C# que precisa ser verificado para determinar se ele é igual a um de um conjunto de variáveis, qual é a melhor maneira de fazer isso?

Eu não estou procurando por uma solução que armazena o conjunto em uma matriz.Eu estou mais curioso para ver se há uma solução que utiliza a lógica booleana, de alguma forma, para obter a resposta.

Eu sei que eu poderia fazer algo assim:

int baseCase = 5;
bool testResult = baseCase == 3 || baseCase == 7 || baseCase == 12 || baseCase == 5;

Estou curioso para ver se eu poderia fazer algo mais parecido com este:

int baseCase = 5;
bool testResult = baseCase == (3 | 7 | 12 | 5);

Obviamente, o acima não funcionar, mas eu estou interessado em ver se há algo mais sucinto do que o meu primeiro exemplo, que tem de repetir a mesma variável e outra vez para cada valor de teste.

ATUALIZAÇÃO:
Eu decidi aceitar CoreyN a resposta de como ele parece ser a abordagem mais simples.É prático, e ainda simples para um iniciante entender, eu acho.

Infelizmente onde eu trabalho o nosso sistema usa a .NET framework 2.0 e não há nenhuma chance de atualizar qualquer momento em breve.Existem outras soluções que não dependem da .NET framework 3.5, além da mais óbvia que eu posso pensar:

new List<int>(new int[] { 3, 6, 7, 1 }).Contains(5);
Foi útil?

Solução

        bool b = new int[] { 3,7,12,5 }.Contains(5);

Outras dicas

Você pode fazer algo semelhante com .NET 2.0, aproveitando-se do fato de que uma matriz de T implementa IList<T>e IList<T> tem um Contém o método.Portanto, o seguinte é equivalente a de em Corey .NET 3.5 solução, embora, obviamente, menos clara:

bool b = ((IList<int>)new int[] { 3, 7, 12, 5 }).Contains(5); 

Muitas vezes eu uso IList<T> para declarações de matriz, ou pelo menos para a passagem de um vetor de argumentos.Isso significa que você pode usar IList propriedades, tais como Contagem, e mudar a partir de uma matriz para uma lista facilmente.E. g.

private readonly IList<int> someIntegers = new int[] { 1,2,3,4,5 };

Eu normalmente uso CoreyN's solução para casos simples assim.Qualquer coisa mais complexa, use uma consulta LINQ.

Desde que você não especificar o tipo de dados como entrada, eu vou assumir que você pode particionar a sua entrada em potências de 2 -> 2,4,8,16...Isto irá permitir que você use os bits para determinar se o valor de teste é um dos bits na entrada.

4 => 0000100
16 => 0010000
64 => 1000000

usando alguns matemática binária...

testList = 4 + 16 + 64 => 1010100
testValue = 16
testResult = testList & testValue

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top