web-dev-qa-db-fra.com

Comment puis-je retourner un IEnumerable vide?

É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.

305
Sergio Tapia

Vous pouvez utiliser list ?? Enumerable.Empty<Friend>() ou avoir FindFriends return Enumerable.Empty<Friend>()

534
Michael Mrozek

Vous pouvez retourner Enumerable.Empty<T>() .

149
LukeH

Quant à moi, le plus élégant est yield break

93
Pavel Tupitsyn

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
                }
        }
    }
}
8
Chaos

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.

1
James Curran