关于C#:如何返回空的IEnumerable?

How can I return an empty IEnumerable?

考虑到下面的代码和这个问题中给出的建议,我决定修改这个原始方法,并询问ienumable中是否有任何值返回它,如果不返回没有值的ienumerable。

方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
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
            });
        }

因为一切都在返回声明中,我不知道该怎么做。想要这个工作吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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;
            }

        }

谢谢你抽出时间。


您可以使用list ?? Enumerable.Empty(),或者让FindFriends返回Enumerable.Empty()


你可以退回Enumerable.Empty()


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


当然,这只是个人偏好的问题,但我会用yield return编写这个函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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
                }
        }
    }
}

我想最简单的方法是

1
 return new Friend[0];

返回的要求只是方法返回一个实现IEnumerable的对象。在不同的情况下,返回两种不同类型的对象是不相关的,只要两者都实现IEnumerable。