Vérifier si tous les éléments d'une collection ont la même valeur
une méthode d'extension sur une collection nommée MeasurementCollection vérifie si la propriété Modèle.Fréquence (Enum) de chaque élément a la même valeur.
public static bool IsQuantized(this MeasurementCollection items)
{
return (from i in items
select i.Template.Frequency)
.Distinct()
.Count()==1;
}
modifier
info sur les classes sous-jacentes
MeasurementCollection : ICollection<IMeasurement>
IMeasurement
{
IMeasurementTemplate Template { get; }
......
}
Est-ce une bonne approche ou est-il une solution facile, déjà dans Linq?
Cette méthode sera utilisée intense dans l'application.
Avez-vous des conseils à prendre avec moi, de retour à la planche à dessin?
source d'informationauteur Caspar Kleijne
Vous devez vous connecter pour publier un commentaire.
Edit: pour répondre Timwi préoccupations concernant les 3 agents recenseurs:
Qui utilise toujours les 2 agents recenseurs. Pas un problème pour la moyenne
List<>
mais pour un DB de la requête, il pourrait payer pour utiliser le moins lisible:Vous pourriez juste trouver la première valeur et de vérifier si TOUTES les autres sont différentes, ce qui permet d'éviter d'avoir à eval l'ensemble de la collection (sauf si la seule valeur différente est la dernière)
D'abord un général linq conseiller. Si vous venez de quel savoir s'il y a exactement un dans une collection à usage Unique() ou SingleOrDefault(). Nombre potentiellement itérer l'ensemble de la collection qui est plus que vous avez besoin, car vous pouvez renflouer si il y en a deux.
J'ai un peu d'inspiration et de réflexion sur une solution avec seulement de la vitesse à l'esprit. Ce n'est vraiment pas lisible (qui j'ai l'habitude de preferre), mais les caractéristiques quand il s'agit de la vitesse devrait être assez bon.
Le pire des cas est le même pour la plupart des autres implémentations de O(n), mais il est très peu probable car il faudrait prévoir tous de la première moitié des éléments à l'égalité des et la seconde moitié de tous être égaux, mais pas égale à la valeur dans la première moitié.
et aurait besoin du même nombre de comparaisons comme une recherche linéaire.
Dans la plupart des autres cas avec la première bizarre dans un endroit aléatoire cela nécessitera de la moitié du nombre des comparaisons, dans le linéaire.
Dans le cas où les valeurs sont en paires. De sorte que l'élément[0] = = [1] et point[2] == point[3] et élément[0] != l'article[2] (et similaires), puis la recherche linéaire sera plus rapide.
En général, soit avec des données aléatoires ou peu étrange une fois cela devrait être plus rapide qu'une recherche linéaire
avec la queue d'appel d'optimisation de cette fonction utilise de la mémoire supplémentaire (le pire des cas d'une quantité de mémoire près de la quantité de mémoire utilisée pour la source d'origine). La pile d'appel ne devrait pas avoir de profondeur, bien que depuis pas IEnumerable des implémentations concrètes (au moins que je suis au courant) peut contenir plus de int.MaxValue éléments. qui aurait besoin d'un max de 31 récurrences.
Il serait plus comme ça:
Il sera de retour faux sur le premier élément du modèle de fréquence différentes, tandis que dans votre code, l'algorithme passe à l'ensemble de la collection.
Je l'ai fait de cette façon:
Utilisation:
C'est un menu déroulant avec une liste de statuts. Le formulaire de modifications de multiples atouts. La liste déroulante besoin de savoir si les actifs ont tous la même valeur ou pas. Mon Même de l'extension de cette.
Je dirais solution suivante: