Si tous les éléments d'une liste ont la même valeur, alors je dois utiliser cette valeur, sinon je dois utiliser une «otherValue». Je ne peux pas penser à une manière simple et claire de faire cela.
122
Si tous les éléments d'une liste ont la même valeur, alors je dois utiliser cette valeur, sinon je dois utiliser une «otherValue». Je ne peux pas penser à une manière simple et claire de faire cela.
Réponses:
La manière la plus propre que je puisse imaginer. Vous pouvez en faire une ligne unique en insérant val, mais First () serait évalué n fois, doublant le temps d'exécution.
Pour incorporer le comportement "ensemble vide" spécifié dans les commentaires, il vous suffit d'ajouter une ligne supplémentaire avant les deux ci-dessus:
la source
.Any
permettrait à l'énumération de s'arrêter tôt dans les cas où les valeurs diffèrent?All
se terminera dès qu'il atteindra un élémentx
de la séquence pour laquellex.Value != val
. De même,Any(x => x.Value != val)
se terminerait dès qu'il atteint un élémentx
de la séquence pour laquellex.Value != val
. Autrement dit, les deuxAll
etAny
présentent un "court-circuit" analogue à&&
et||
(qui est effectivement ce queAll
etAny
sont).return yyy.Skip(1).All(x=>x.Value == val) ? val : otherValue;
Bon test rapide pour tous égaux:
la source
Class
, bien que cela devrait fonctionner avec les structures. Idéal pour une liste de primitifs, cependant.collection.Distinct().Count() <= 1
si vous souhaitez autoriser les collections vides..Distinct()
ne fonctionne pas toujours comme prévu - en particulier lorsque vous travaillez avec des objets, voir cette question. Dans ce cas, vous devez implémenter l'interface IEquatable.Distinct
ne traversera pas du tout la collection, etCount
fera un parcours viaDistinct
l'itérateur de.Bien que vous puissiez certainement construire un tel appareil à partir d'opérateurs de séquence existants, je serais dans ce cas enclin à écrire celui-ci en tant qu'opérateur de séquence personnalisé. Quelque chose comme:
C'est assez clair, court, couvre tous les cas et ne crée pas inutilement des itérations supplémentaires de la séquence.
Faire de cela une méthode générique qui fonctionne
IEnumerable<T>
est laissé comme un exercice. :-)la source
other
lorsque lanull
réponse était (vraisemblablement) correcte. Disons que la fonction étaitT Unanimous<U, T>(this IEnumerable<U> sequence, T other)
ou une telle signature, cela la complique un peu.Ou si vous craignez d'exécuter First () pour chaque élément (ce qui pourrait être un problème de performance valide):
la source
Cela peut être tardif, mais une extension qui fonctionne pour les types valeur et référence de la même manière basée sur la réponse d'Eric:
la source
la source
Une alternative à l'utilisation de LINQ:
J'ai trouvé que l'utilisation
HashSet<T>
est plus rapide pour les listes jusqu'à ~ 6000 entiers par rapport à:la source
HashSet<T>
J'ai créé une application console et trouvez que c'est initialement plus rapide que d'utiliser les instructions LINQ dans ma réponse. Cependant, si je fais cela en boucle, LINQ est plus rapide.GetHashCode()
, ce qui est difficile à faire correctement Voir: stackoverflow.com/a/371348/2607840 pour plus de détails.Une légère variation par rapport à l'approche simplifiée ci-dessus.
var result = yyy.Distinct().Count() == yyy.Count();
la source
Si un tableau est de type multidimensionnel comme ci-dessous, nous devons écrire ci-dessous linq pour vérifier les données.
exemple: ici les éléments sont 0 et je vérifie que toutes les valeurs sont 0 ou non.
ip1 =
0 0 0 0
0 0 0
0 0 0 0
0 0 0 0
la source