J'ai n champs dans une classe. Au plus l'un d'entre eux est autorisé à être défini, et j'ai donc besoin de jeter une exception si ce n'est pas le cas. Je connais la valeur de n.
Je peux faire cela la manière évidente: p> Cependant, la longueur de ceci est n ^ 2 dans le nombre de champs, et Je ne veux certainement pas écrire cela pour par exemple. 10 champs. P> J'ai vu des suggestions qui recommandent de faire cela par réflexion. Cependant, tandis que c'est nécessaire où vous ne connaissez pas la valeur de N, je ne peux pas m'empêcher de penser qu'il doit y avoir une manière plus simple ici. P> y a-t-il donc un moyen de vérifier si un moyen de vérifier si Les valeurs ne sont pas nuls, tandis qu'accédant à chaque valeur une fois? p> p>
3 Réponses :
public int NotNullToOne<T>(T val) => val is null ? 0 : 1; if (NotNullToOne(field1) + NotNullToOne(field2) + NotNullToOne(field3) + ... > 1) throw new Exception(); NotNullToOne returns 1 if the value is not null, o if it is.If more than one value is null, the sum of all the NotNullToOnes will be greater than 1, and so this will throw.
Dans son code dans la question, il vérifie chaque combinaison de champs, à savoir. "9 Fields OK + 1 NULL" Alors "8 champs OK + 1 NULL + 1 champ OK", etc. Celui-ci compte les champs OK et vérifie.
Ceci est linéaire dans le nombre de champs, pas quadratique.
C'est exactement le Lasse Vågsæther Karlsen i> mentionné dans son commentaire à votre question.
@ Mrsmith42 oui c'est. Je pense à cela et j'écris cette réponse, tandis qu'il écrivait ce commentaire.
Vous pouvez avoir un compteur pour le nombre de champs définis.
int numberOfSetFields = 0; int NumberOfSetFields { get { return numberOfSetFields; } set { numberOfSetFields = value; if (numberOfSetFields > 1) throw new Exception(); } } if (field1 != null) NumberOfSetFields++; if (field2 != null) NumberOfSetFields++; if (field3 != null) NumberOfSetFields++; ...
Vous pouvez utiliser une méthode d'assistance avec un nom descriptif qui le rend plus clair sur le côté appelant ce que vous essayez de vérifier, comme celui-ci:
if (MoreThanOneNotNull(field1, field2, field3, field4, ... )) // ...
Je pense que l'inconvénient de cela est qu'il alloue inutilement un tableau, mais dans de nombreux contextes qui seront une optimisation prématurée, et c'est certainement plus clair que ma solution.
Comptez le nombre de champs NULL / non nuls et comparez. Ou simplement utiliser un type de collection pour contenir les valeurs (en supposant qu'ils sont le même type).
repenser ça. Utilisez un tableau ou une autre structure de données énumérable. Ou incrémenter une valeur chaque fois que vous rencontrez un non-null, lancez dès que le compte atteint deux.
@dlatikay. Parfois, un tableau est approprié. Parfois, ce n'est pas le cas.