SingleOrDefault () renvoie une exception sur plus d'un élément
J'obtiens une exception chaque fois que je chercher comme ça
Feature f = o.Features.SingleOrDefault(e => e.LinkName == PageLink);
parce que cela peut renvoyer un ou plus d'un élément. Qu'est-ce que l'approche alternative que je peux utiliser pour résoudre ce problème?
source d'informationauteur Fraz Sundal
Vous devez vous connecter pour publier un commentaire.
Unique et SingleOrDefault sont conçus pour le lancer si plus d'une correspondance existe dans la séquence. Une conséquence de cela est que l'ensemble de la séquence doit être réitéré avant la fin. Il n'a pas l'impression que c'est ce que vous voulez. Essayez FirstOrDefault à la place:
Ce sera (généralement) plus performants, car il se termine dès qu'une correspondance est trouvée.
Bien sûr, si vous voulez les conserver plus d'un élément, une clause where serait plus approprié:
Alternativement, si vous voulez seulement le point quand il y a exactement un match et ne veux pas jeter quand il y a plus d'un, cela peut être facilement accompli. J'ai créé une méthode d'extension dans mon projet:
Si vous voulez seulement le première élément, utilisez
FirstOrDefault
à la place.En gros, voici les options en termes de résultats valides (c'est à dire là où vous ne voulez pas pour les jeter) et ce à utiliser:
Single
SingleOrDefault
First
FirstOrDefault
(
ElementAt
etElementAtOrDefault
Last
etLastOrDefault
sont également disponibles.)SingleOrDefault
suggère que vous vous attendez à 0 ou 1 les résultats de votre requête. Si vous avez plus de 1 alors il ya quelque chose de mal avec votre données ou d'une requête.Si vous vous attendez à plus de 1 suite et que vous souhaitez uniquement le premier, puis
FirstOrDefault
doit être utilisé.J'ai trouvé, j'ai besoin de le comportement de retourner une valeur par défaut s'il n'est pas exactement un seul élément (c'est à dire zéro, deux, ou plus) plus souvent que j'ai besoin de la normale
SingleOrDefault
comportement, alors voici ma version adaptée de Pieter van Ginkel réponse:J'ai omis de l'argument null vérifie parce que je suis OK avec en s'appuyant sur la
Take
etWhere
appels à lancer des exceptions lorsque les arguments sont nuls, mais vous pourriez vous sentir autrement.Single
signifie que vous vous attendez à être un élément dans la séquence.SingleOrDefault
signifie que vous vous attendez à être zéro ou un des éléments dans la séquence.Cette fonction doit être utilisée lorsque vous voulez savoir il y a un (ou zéro) et que vous souhaitez bloquer lorsque plus d'un, elle revint.
Si vous êtes après une, utilisation
First
(ouFirstOrDefault
) comme suggéré ci-dessus, mais assurez-vous de commander correctement les données.Si vous utilisez SingleOrDefault si la condition de satisfaire plus de résultat qu'il va jeter erreur.
vous pouvez atteindre votre résultat à l'aide de FirstOrDefault