162 votes

En utilisant linq ou autrement, comment vérifier si tous les éléments de la liste ont la même valeur et la renvoyer, ou renvoyer une "autreValeur" s'ils ne le font pas?

Si tous les éléments d'une liste ont la même valeur, je dois utiliser cette valeur, sinon je dois utiliser une "autreValeur". Je ne peux pas penser à un moyen simple et clair de le faire.

voir aussi la bonne façon d'écrire une boucle qui a une logique spéciale pour le premier élément d'une collection.

205voto

KeithS Points 36130
 var val = yyy.First().Value;
return yyy.All(x=>x.Value == val) ? val : otherValue; 
 

Le moyen le plus propre auquel je puisse penser. Vous pouvez en faire une ligne en insérant val, mais First () serait évalué n fois, ce qui doublerait le temps d'exécution.

Pour incorporer le comportement "ensemble vide" spécifié dans les commentaires, vous devez simplement ajouter une ligne supplémentaire avant les deux ci-dessus:

 if(yyy == null || !yyy.Any()) return otherValue;
 

137voto

Jeremy Bell Points 586

Bon test rapide pour tous égaux:

 collection.Distinct().Count() = 1
 

24voto

Eric Lippert Points 300275

Bien que vous puissiez certainement construire un tel dispositif à 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:

 // Returns "other" if the list is empty.
// Returns "other" if the list is non-empty and there are two different elements.
// Returns the element of the list if it is non-empty and all elements are the same.
public static int Unanimous(this IEnumerable<int> sequence, int other)
{
    int? first = null;
    foreach(var item in sequence)
    {
        if (first == null)
            first = item;
        else if (first.Value != item)
            return other;
    }
    return first ?? other;
}
 

C'est assez clair, bref, couvre tous les cas et ne crée pas inutilement des itérations supplémentaires de la séquence.

Transformer cela en une méthode générique qui fonctionne sur IEnumerable<T> reste un exercice. :-)

16voto

Justin Niessner Points 144953
 return collection.All(i => i == collection.First())) 
    ? collection.First() : otherValue;.
 

Ou si vous êtes inquiet à l'idée d'exécuter First () pour chaque élément (ce qui peut être un problème de performance valable):

 var first = collection.First();
return collection.All(i => i == first) ? first : otherValue;
 

2voto

hackerhasid Points 3781
public int GetResult(List<int> list){
int first = list.First();
return list.All(x => x == first) ? first : SOME_OTHER_VALUE;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X