鉴于以下代码和此问题给出的建议,我决定修改此原始方法,并询问IEnumarable中是否有任何值返回它,如果不返回没有值的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;
            } 

        }


谢谢您的时间。

评论

在这里查看代码,您应该使用yield return和yield break。

#1 楼

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

评论


如果他返回了新的List (),它将改变事情,因为从该方法返回时,它将被转换为IEnumerable

–萨拉船
2010年7月12日在16:57

新的List ()是更昂贵的操作,因为它将创建一个列表实例(并在进程中为其分配内存)

–伊戈尔·帕什丘克(Igor Pashchuk)
2011年6月30日20:14



#2 楼

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

#3 楼

对我来说,最优雅的方式是yield break

评论


但这就是如果您使用收益率回报,不是吗?

–Svish
10年7月12日在15:28

+1,因为他的代码正确地应该使用yield来处理IEnumerable

–克里斯·马里西奇(Chris Marisic)
2010年7月12日在15:32

请原谅我对这个问题的无知,但是请您说明一下在这种情况下如何使用收益率折让?我仅在for循环中看到过示例,但这对我来说并没有清晰的画面。

–塞尔吉奥·塔皮亚(Sergio Tapia)
10年7月12日在15:34

用示例更新了答案。我同意,这确实是最优雅的做法。 :)

–Johny Skovdal
15年7月9日在12:24

编辑在同行评审中被拒绝,所以这是我在谈论@Pyritie的示例-尽管格式混乱,所以我也将其添加到pastebin.com/X9Z49Vq1:public IEnumerable FindFriends(){if(! userExists)产量下降; foreach(doc.Descendants(“ user”)中的var后裔。选择(user => new Friend {ID = user.Element(“ id”)。Value,Name = user.Element(“ name”)。Value,URL = user.Element(“ url”)。Value,Photo = user.Element(“ photo”)。Value})){收益返回子孙; }}

–Johny Skovdal
16-3-31在19:31

#4 楼

当然,这只是个人喜好问题,但是我会使用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
                }
        }
    }
}


#5 楼

我认为最简单的方法是

 return new Friend[0];


返回的要求仅仅是该方法返回实现IEnumerable<Friend>的对象。只要在两种情况下都实现IEnumerable,则在不同情况下返回两种不同对象的事实就无关紧要。

评论


Enumerable.Empty 实际上返回一个T的空数组(T [0]),其优点是可以重用相同的空数组。注意,这种方法对于非空数组不是理想的,因为可以修改元素(但是无法调整数组的大小,调整大小涉及创建新实例)。

–弗朗西斯·加涅(FrancisGagné)
2010年7月12日在15:40

#6 楼

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