我如何返回一个空的IEnumerable?

对于下面的代码和在这个问题中给出的建议,我决定修改这个原始方法,并询问在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;
}
}

谢谢你的宝贵时间。

181936 次浏览

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

它可以在System.Linq命名空间下找到。

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

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

我认为最简单的方法是

 return new Friend[0];

返回值的要求仅仅是方法返回一个实现IEnumerable<Friend>的对象。在不同的情况下返回两种不同类型的对象是无关紧要的,只要它们都实现了IEnumerable。

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

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