Vérifiez si tous les éléments sont les mêmes dans une Liste
J'ai une Liste(DateTime) des éléments. Comment puis-je vérifier si tous les éléments sont de même avec une requête LINQ? À tout moment, il peut être de 1, 2, 20, 50 ou 100 éléments dans la liste.
Potentiellement plus facile à lire avec "Tous" au lieu de "Tout". Vous pouvez également utiliser la fonction Premier() au lieu de [0] dans le cas où la liste d'accès ne peut pas être effectuée (IEnumerable). if (liste.Tous(o => o == liste.First())) { ... }
list.Distinct().Skip(1).Any() n'est pas différent de list.Distinct().Count != 1 droit?
le point de l'ensemble de Tout() est d'être plus rapide si un élément est trouvé NE correspond PAS. Puis vous vous arrêtez l'évaluation de la liste. Ce qui EST légèrement plus claire est bien !(list.Any(o => o != list[0])) qui est vrai, s'il n'y a pas des éléments qui sont différentes de la première - c'est à dire si ils sont tous les mêmes
est utilisé pour trouver au moins 1 correspondent à tout All() est utilisé pour s'assurer que tous les éléments de correspondance. Dans les deux cas, si un non-match est rencontré dans la totalité ou une correspondance est trouvée, en Tout, ils vont arrêter l'itération. Donc !(list.Any(o => o != list[0])); et list.All(o => o == list[0]); aura toujours le même nombre d'itérations. Ainsi, les deux ont environ le même temps d'exécution. P. S. Vous avez raison, dans ce list.Distinct().Skip(1).Any() est analogue à list.Distinct().Count != 1 juste être conscient nombre peut être plus lent que d' (peut-être même dans ce cas) avec > 1 élément.
De tous les exemples fournis, liste.Distinct().Count != 1 est le plus lisible (à mon avis)
J'ai créé la simple extension de la méthode principalement pour des raisons de lisibilité qui fonctionne sur tous les IEnumerable.
if(items.AreAllSame())...
Et la méthode de mise en œuvre:
///<summary>/// Checks whether all items in the enumerable are same (Uses <see cref="object.Equals(object)" /> to check for equality)///</summary>///<typeparam name="T"></typeparam>///<param name="enumerable">The enumerable.</param>///<returns>/// Returns true if there is 0 or 1 item in the enumerable or if all items in the enumerable are same (equal to/// each other) otherwise false.///</returns>publicstaticboolAreAllSame<T>(thisIEnumerable<T> enumerable){if(enumerable ==null)thrownewArgumentNullException(nameof(enumerable));using(var enumerator = enumerable.GetEnumerator()){var toCompare =default(T);if(enumerator.MoveNext()){
toCompare = enumerator.Current;}while(enumerator.MoveNext()){if(toCompare !=null&&!toCompare.Equals(enumerator.Current)){returnfalse;}}}returntrue;}
Il est plus rapide que if (list.Distinct().Skip(1).Any()) , et effectue de la même manière que if (list.Any(o => o != list[0])), cependant, la différence n'est pas significative, alors je vous suggérons d'utiliser le plus lisible un.
Comme ceci:
Ou
(qui est probablement plus rapide)
list.Distinct().Skip(1).Any()
n'est pas différent delist.Distinct().Count != 1
droit?!(list.Any(o => o != list[0]))
qui est vrai, s'il n'y a pas des éléments qui sont différentes de la première - c'est à dire si ils sont tous les mêmesAll()
est utilisé pour s'assurer que tous les éléments de correspondance. Dans les deux cas, si un non-match est rencontré dans la totalité ou une correspondance est trouvée, en Tout, ils vont arrêter l'itération. Donc!(list.Any(o => o != list[0]));
etlist.All(o => o == list[0]);
aura toujours le même nombre d'itérations. Ainsi, les deux ont environ le même temps d'exécution. P. S. Vous avez raison, dans celist.Distinct().Skip(1).Any()
est analogue àlist.Distinct().Count != 1
juste être conscient nombre peut être plus lent que d' (peut-être même dans ce cas) avec > 1 élément.J'ai créé la simple extension de la méthode principalement pour des raisons de lisibilité qui fonctionne sur tous les IEnumerable.
Et la méthode de mise en œuvre:
C'est une option, trop:
Il est plus rapide que
if (list.Distinct().Skip(1).Any())
, et effectue de la même manière queif (list.Any(o => o != list[0]))
, cependant, la différence n'est pas significative, alors je vous suggérons d'utiliser le plus lisible un.VB.NET version:
Ou
Ma variante: