J'ai une classe, comme ceci:
public class MyClass
{
public int Value { get; set; }
public bool IsValid { get; set; }
}
En réalité, il est beaucoup plus grande, mais cela recrée le problème (étrangeté).
Je veux obtenir la somme des Value
, où l'instance est valide. Jusqu'à présent, j'ai trouvé deux solutions à cela.
Le premier est celui-ci:
int result = myCollection.Where(mc => mc.IsValid).Select(mc => mc.Value).Sum();
Le second, cependant, est la suivante:
int result = myCollection.Select(mc => mc.IsValid ? mc.Value : 0).Sum();
Je veux obtenir la méthode la plus efficace. J'ai d'abord pensé que le second serait plus efficace. Ensuite, la partie théorique de moi a commencé à aller "eh Bien, l'un est O(n + m + m), l'autre est O(n + n). La première, on devra faire mieux avec plus de invalides, tandis que le second, on devra faire mieux avec moins". Je pensais qu'ils feraient tout aussi. EDIT: Et puis @Martin a souligné que le " Où " et le Sélectionner étaient combinés, de sorte qu'il devrait en fait être en O(m + n). Cependant, si vous regardez ci-dessous, il semble que ce n'est pas lié.
Donc je l'ai mis à l'épreuve.
(C'est+ de 100 lignes, j'ai donc pensé que c'était mieux de poster comme un Essentiel).
Les résultats ont été... intéressant.
Avec 0% de la cravate de la tolérance:
Les échelles sont en faveur de l' Select
et Where
, par environ 30 points.
How much do you want to be the disambiguation percentage?
Avec 2% de la cravate de la tolérance:
C'est la même chose, sauf que pour certains, ils étaient à moins de 2%. Je dirais que c'est un minimum de marge d'erreur.
et
0
maintenant avoir juste une ~20 points d'avance.
Avec 5% de la cravate de la tolérance:
C'est ce que je dirais à ma marge d'erreur maximale. Il fait un peu mieux pour l'
Starting benchmarking.
, mais pas beaucoup.
Avec 10% de la cravate de la tolérance:
C'est moyen de sortir de ma marge d'erreur, mais je suis toujours intéressé par le résultat. Parce qu'il donne l'
Ties: 0
et
de la vingt points d'avance, il avait depuis un moment maintenant.
Where + Select: 65
Avec 25% de la cravate de la tolérance:
C'est une façon, de manière à sortir de ma marge d'erreur, mais je suis toujours intéressé par le résultat, parce que l'
et
Select: 36
encore (presque) garder leurs 20 points d'avance. Il semble que c'est le surclassant dans une quelques-uns, et c'est ce que donner de la tête.
Maintenant, j'imagine que 20 points d'avance, est venu à partir du milieu, où ils sont à la fois lié à obtenir autour de la même performance. Je pourrais essayer de l'enregistrer, mais il serait un chargement entier de l'information. Un graphique serait mieux, je pense.
Donc, c'est ce que j'ai fait.
Il montre que l'
ligne garde régulière (prévu) et que l' Select
ligne de grimpe (prévu). Cependant, ce qui m'intrigue, c'est pourquoi il ne rencontre pas l' Where
à 50 ou plus tôt: en fait, je m'attendais plus tôt que 50, comme un supplément, agent recenseur devait être créé pour l'
How much do you want to be the disambiguation percentage?
et
. Je veux dire, ce qui montre l'20 points d'avance, mais ça n'explique pas pourquoi. Cela, je pense, c'est le point principal de ma question.
Pourquoi faut-il se comporter comme cela? Dois-je lui faire confiance? Si non, dois-je utiliser l'autre ou les autres?
@KingKong mentionné dans les commentaires, vous pouvez également utiliser
2
s'surcharge qui prend un lambda. Donc, mes deux options sont maintenant changé à cela:
D'abord:
Deuxième:
Starting benchmarking.
Je vais le faire un peu plus court, mais:
Le vingt-point est toujours là, le sens qu'il n'a pas à faire avec l'
Ties: 6
et
combinaison l'a souligné @Marcin dans les commentaires.
Merci pour la lecture par le biais de mon mur de texte! Aussi, si vous êtes intéressés, voici la version modifiée qui enregistre au format CSV Excel prend en.