我怎样才能返回一个空的IEnumerable?

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

上述方法不起作用,实际上不应该; 我只是觉得这说明了我的意图。 我觉得我应该指定代码不起作用,因为你不能创build一个抽象类的实例。

这里是调用代码,我不希望它在任何时候收到一个空的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; } } 

感谢您的时间。

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

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

至于我,最优雅的方式就是yield break

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

我认为最简单的方法是

  return new Friend[0]; 

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