É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 existe des valeurs dans IEnumarable, si elle est retournée, sinon renvoyer un IEnumerable sans valeur.
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 dans la déclaration de retour, je ne sais pas comment je pourrais le faire. Est-ce que quelque chose aimerait 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, ce n'est pas censé; Je sens juste que cela illustre mes intentions. Je pense devoir spécifier que le code ne fonctionne pas car vous ne pouvez pas créer d'instance de classe abstraite.
Voici le code d'appel, je ne veux pas qu'il reçoive un IEnumerable null à 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.
Vous pouvez utiliser list ?? Enumerable.Empty<Friend>()
ou avoir FindFriends
return Enumerable.Empty<Friend>()
Vous pouvez retourner Enumerable.Empty<T>()
.
Quant à moi, le plus élégant est yield break
Ce n'est bien sûr qu'une question de préférence personnelle, mais j'écrirais cette fonction en utilisant return return:
public IEnumerable<Friend> FindFriends()
{
//Many thanks to Rex-M for his help with this one.
//http://stackoverflow.com/users/67/rex-m
if (userExists)
{
foreach(var user in doc.Descendants("user"))
{
yield return new Friend
{
ID = user.Element("id").Value,
Name = user.Element("name").Value,
URL = user.Element("url").Value,
Photo = user.Element("photo").Value
}
}
}
}
Je pense que le moyen le plus simple serait
return new Friend[0];
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 renvoyez deux types d'objets est sans importance, tant que les deux implémentent IEnumerable.