Как я могу возвратить пустой IEnumerable?

Учитывая следующий код и предложения, данные в этом вопросе, я решил изменить этот исходный метод и спросить, существуют ли какие-либо значения в возврате IEnumarable он, если не возвращают IEnumerable без значений.

Вот метод:

public IEnumerable 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
            });
        }

Так как все в операторе возврата, я не знаю, как я мог сделать это. Что-то вроде этого работало бы?

public IEnumerable 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();
            }
        }

Вышеупомянутый метод не работает, и на самом деле он, как не предполагается; я просто чувствую, что это иллюстрирует мои намерения. Я чувствую, что должен указать, что код не работает, потому что Вы не можете создать экземпляр абстрактного класса.

Вот код вызова, я не хочу, чтобы он получил пустой IEnumerable в любое время:

private void SetUserFriends(IEnumerable 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;
            } 

        }

Спасибо за Ваше время.

309
задан Community 23 May 2017 в 02:10
поделиться

5 ответов

Вы можете использовать список ?? Enumerable.Empty () или FindFriends return Enumerable.Empty ()

542
ответ дан 23 November 2019 в 01:14
поделиться

Думаю, что проще всего будет

 return new Friend[0];

Требования к return сводятся к тому, чтобы метод возвращал объект, реализующий IEnumerable. Тот факт, что при разных обстоятельствах вы возвращаете два разных типа объектов, не имеет значения, пока оба реализуют IEnumerable.

1
ответ дан 23 November 2019 в 01:14
поделиться

Вы могли бы вернуть Enumerable.Empty()

156
ответ дан 23 November 2019 в 01:14
поделиться

На мой взгляд, самый элегантный способ - это yield break

97
ответ дан 23 November 2019 в 01:14
поделиться

Это, конечно, вопрос личных предпочтений, но я бы написал эту функцию с использованием yield 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
ответ дан 23 November 2019 в 01:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: