Étant donné le code suivant et les suggestions données dans cette question J'ai décidé de modifier cette méthode originale et de demander s'il y a des valeurs dans l'IEnumarable, de le retourner, sinon de retourner un IEnumerable sans valeurs.
Voici la méthode :
public IEnumerable<Friend> FindFriends()
{
//Many thanks to Rex-M for his help with this one.
//https://stackoverflow.com/users/67/rex-m
return doc.Descendants("user").Select(user => new Friend
{
ID = user.Element("id").Value,
Name = user.Element("name").Value,
URL = user.Element("url").Value,
Photo = user.Element("photo").Value
});
}
Comme tout se trouve dans l'instruction de retour, je ne sais pas comment faire. Est-ce que quelque chose comme ceci fonctionnerait ?
public IEnumerable<Friend> FindFriends()
{
//Many thanks to Rex-M for his help with this one.
//https://stackoverflow.com/users/67/rex-m
if (userExists)
{
return doc.Descendants("user").Select(user => new Friend
{
ID = user.Element("id").Value,
Name = user.Element("name").Value,
URL = user.Element("url").Value,
Photo = user.Element("photo").Value
});
}
else
{
return new IEnumerable<Friend>();
}
}
La méthode ci-dessus ne fonctionne pas, et en fait elle n'est pas censée fonctionner ; je pense simplement qu'elle illustre mes intentions. Je pense que je dois préciser que le code ne fonctionne pas car on ne peut pas créer une instance d'une classe abstraite.
Voici le code d'appel, je ne veux pas qu'il reçoive un IEnumerable nul à tout moment :
private void SetUserFriends(IEnumerable<Friend> list)
{
int x = 40;
int y = 3;
foreach (Friend friend in list)
{
FriendControl control = new FriendControl();
control.ID = friend.ID;
control.URL = friend.URL;
control.SetID(friend.ID);
control.SetName(friend.Name);
control.SetImage(friend.Photo);
control.Location = new Point(x, y);
panel2.Controls.Add(control);
y = y + control.Height + 4;
}
}
Merci pour votre temps.
2 votes
En regardant le code ici, vous devriez utiliser yield return et yield break.