Étant donné le code suivant et les suggestions données dans cette question , j'ai décidé de modifier cette méthode d'origine et de demander s'il y a des valeurs dans le IEnumarable le renvoyer, sinon 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
});
}
Puisque tout est à l'intérieur de la déclaration de retour, je ne sais pas comment je pourrais faire cela. Quelque chose comme ce travail?
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 le faire; J'ai l'impression que cela illustre mes intentions. Je pense que je devrais spécifier que le code ne fonctionne pas parce que vous ne pouvez pas créer une instance d'une classe abstraite.
Voici le code appelant, 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.
la source
Réponses:
Vous pouvez utiliser
list ?? Enumerable.Empty<Friend>()
ou avoir unFindFriends
retourEnumerable.Empty<Friend>()
la source
new List<Friend>()
car il sera converti enIEnumerable<Friend>
retour de cette méthode?new List<Friend>()
est une opération plus coûteuse car elle créerait une instance d'une liste (et lui allouerait de la mémoire dans le processus)Tu pourrais revenir
Enumerable.Empty<T>()
.la source
Quant à moi, la façon la plus élégante est
yield break
la source
public IEnumerable<Friend> FindFriends() { if(!userExists) yield break; foreach(var descendant in 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 })) { yield return descendant; } }
Ce n'est bien sûr qu'une question de préférence personnelle, mais j'écrirais cette fonction en utilisant le rendement de rendement:
la source
Je pense que la façon la plus simple serait
Les exigences du retour sont simplement que la méthode retourne un objet qui implémente
IEnumerable<Friend>
. Le fait que, dans des circonstances différentes, vous renvoyiez deux types d'objets différents est sans importance, tant que les deux implémentent IEnumerable.la source
la source