2012-07-09 5 views
3

que je fais une simple requête Linq sur un fichier XMLsi IEnumerable <string> retourne juste une chaîne

IEnumerable<string> value = from item in myFile.Descendants("ProductName") 
          select (string)item; 

Normalement (Si j'ai plus d'une ligne) Je peux itérer en utilisant une boucle foreach:

foreach (string str in value) 
{ 
    Console.WriteLine(str); 
} 

Mais si je suis sûr que j'ai un seul élément, et ma signature de la méthode est la suivante:

public string getValue() 
{ 
    return ?; 
} 

Que dois-je retourner (Si je veux supprimer le foreach boucle)?

Répondre

3

Il existe Single/SingleOrDefault et First/FirstOrDefault méthodes pouvant résoudre un nombre d'éléments inférieur à un.

Procédé Singleattend un seul élément et l'exception de la volonté, si le résultat contient zéro ou plus d'un élément. Utilisez SingleOrDefault pour faire face à zéro ainsi qu'un.

La paire "First" peut gérer plus d'une paire, mais First renvoie à nouveau s'il n'y a aucun élément.

Toutes ces méthodes sont accompagnées d'une surcharge qui vous permet de spécifier des conditions, ce qui élimine le besoin d'utiliser un appel .Where.

Dans votre cas:

string value = (from item in myFile.Descendants("ProductName") 
       select (string)item) 
       .SingleOrDefault(); 

Lors du choix entre seul ou premier, utilisez Single si vous attendez un élément, utilisez SingleOrDefault si vous attendez zéro ou un élément, et utiliser First/FirstOrDefault (avec une sorte de OrderBy) si vous ne vous souciez pas combien d'éléments sont retournés.

Notez également que ces méthodes utilisent l'exécution différée. Ainsi, une fois satisfait, First arrête l'itération.

2

Si vous voulez retourner un seul élément, puis FirstOrDefault():

public string getValue() 
{ 
    IEnumerable<string> value = from item in myFile.Descendants("ProductName") 
         select (string)item; 
    return value.FirstOrDefault(); 
} 
5

Si vous êtes sûr qu'il ya toujours exactement une chaîne, vous pouvez revenir value.Single().

Quelques autres options:

Cela dépend si vous voulez soulever une exception s'il y a plus d'un élément (utilisez Single ou SingleOrDefault), ou aucun élément (utilisez First ou Single).

Si vous avez toujours un seul élément, je m'en tiendrai à Single(), car il lèvera une exception s'il y a zéro ou plus d'un élément.

+0

Merci @BigYellowCactus pour votre réponse, mais j'ai choisi Adam Houldsworth parce qu'il a donné un exemple de code et la meilleure explication pour cette situation. –

+0

@Wassim Aucun problème :-) – sloth

0

Si vous êtes sûr que vous n'en avez qu'un et que vous ne pouvez en utiliser qu'un seul, vous devez utiliser Single. Cela va en fait lancer une exception si vous en avez plusieurs.

Questions connexes