鉴于以下代码和在这个问题中给出的建议,我决定修改这个原始方法,并询问是否有任何值在IEnumerable中返回它,如果没有返回一个没有值的IEnumerable。

方法如下:

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

由于所有内容都在return语句中,我不知道如何做到这一点。这样的东西有用吗?

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

上面的方法不起作用,事实上它不应该起作用;我只是觉得这说明了我的意图。我觉得我应该指定代码不起作用,因为您不能创建抽象类的实例。

下面是调用代码,我不希望它在任何时候接收一个空IEnumerable:

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;
    } 
}

谢谢你的宝贵时间。


当前回答

对我来说,最优雅的方式就是忍让

其他回答

public IEnumerable<Friend> FindFriends()
{
    return userExists ? 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
        }): new List<Friend>();
}

对我来说,最优雅的方式就是忍让

你可以返回Enumerable.Empty<T>()。

这当然只是个人偏好的问题,但我会用收益率来写这个函数:

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

你可以使用list ??Enumerable.Empty<Friend>(),或者让FindFriends返回Enumerable.Empty<Friend>()

这可以在系统下找到。Linq命名空间。