Se todos os itens em uma lista tiverem o mesmo valor, preciso usar esse valor, caso contrário, preciso usar um "otherValue". Não consigo pensar em uma maneira simples e clara de fazer isso.
Consulte também Maneira clara de escrever loop que possui lógica especial para o primeiro item de uma coleção.
Respostas:
Maneira mais limpa que consigo pensar. Você pode transformá-lo em uma linha alinhando val, mas First () seria avaliado n vezes, dobrando o tempo de execução.
Para incorporar o comportamento "conjunto vazio" especificado nos comentários, basta adicionar mais uma linha antes das duas acima:
fonte
.Any
permitiria que a enumeração fosse encerrada mais cedo nos casos em que houver valores diferentes?All
terminará assim que atingir um elementox
da sequência para o qualx.Value != val
. Da mesma forma,Any(x => x.Value != val)
terminaria assim que atingir um elementox
da sequência para o qualx.Value != val
. Ou seja, ambosAll
eAny
exibem "curto-circuito" análogo&&
e||
(que é efetivamente o que éAll
e o queAny
é).return yyy.Skip(1).All(x=>x.Value == val) ? val : otherValue;
Bom teste rápido para todos iguais:
fonte
Class
, embora deva funcionar com estruturas. Ótimo para uma lista de primitivos, no entanto.collection.Distinct().Count() <= 1
se desejar permitir coleções vazias..Distinct()
nem sempre funciona como esperado - especialmente quando você trabalha com objetos, consulte esta pergunta. Nesse caso, você precisa implementar a interface IEquatable.Distinct
não percorrerá a coleção eCount
fará uma travessiaDistinct
pelo iterador.Embora você certamente possa construir esse dispositivo a partir de operadores de sequência existentes, nesse caso, eu estaria inclinado a escrevê-lo como um operador de sequência personalizado. Algo como:
Isso é bastante claro, curto, abrange todos os casos e não cria desnecessariamente iterações extras da sequência.
Transformar isso em um método genérico que funciona
IEnumerable<T>
é deixado como um exercício. :-)fonte
other
quando anull
resposta estivesse realmente correta (presumivelmente). Digamos que a função tenha sidoT Unanimous<U, T>(this IEnumerable<U> sequence, T other)
ou algo assim, isso complica um pouco.Ou se você estiver preocupado em executar o First () para cada elemento (o que pode ser uma preocupação válida de desempenho):
fonte
Pode ser tarde, mas uma extensão que funciona tanto para tipos de valor quanto de referência com base na resposta de Eric:
fonte
fonte
Uma alternativa ao uso do LINQ:
Eu descobri que o uso
HashSet<T>
é mais rápido para listas de até 6.000 números inteiros em comparação com:fonte
HashSet<T>
é inicialmente mais rápido do que usar as instruções LINQ na minha resposta. No entanto, se eu fizer isso em um loop, o LINQ será mais rápido.GetHashCode()
, o que é difícil de executar corretamente. Consulte: stackoverflow.com/a/371348/2607840 para obter mais detalhes.Uma ligeira variação na abordagem simplificada acima.
var result = yyy.Distinct().Count() == yyy.Count();
fonte
Se uma matriz é do tipo multidimensional como abaixo, precisamos escrever abaixo linq para verificar os dados.
exemplo: aqui os elementos são 0 e eu estou verificando todos os valores são 0 ou não.
ip1 =
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0 0
fonte