方法如下:
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;
}
}
谢谢您的时间。
#1 楼
您可以使用list ?? Enumerable.Empty<Friend>()
或让FindFriends
返回Enumerable.Empty<Friend>()
评论
如果他返回了新的List
–萨拉船
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
–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
–弗朗西斯·加涅(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>();
}
评论
在这里查看代码,您应该使用yield return和yield break。