特别感谢 Rex M for this bit of wisdom :
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
});
}
找到所有用户 friend 后,我需要在 WPF 表单上显示他们。我有一个问题,不是所有用户都至少有 5 个 friend ,有些甚至没有 friend !这是我所拥有的:
private void showUserFriends()
{
if (friendsList.ToList().Count > 0)
{
friend1.Source = new BitmapImage(new Uri(friendsList.ToList()[0].Photo));
label11.Content = friendsList.ToList()[0].Name;
friend2.Source = new BitmapImage(new Uri(friendsList.ToList()[1].Photo));
label12.Content = friendsList.ToList()[1].Name;
//And so on, two more times. I want to show 4 friends on the window.
}
}
所以这个问题有两个部分:
最佳答案
当您在 IEnumerable 上调用 ToList() 时,您正在做的是枚举可枚举列表的所有元素并将结果放入容器中。所以“代码味道”是在同一个 IEnumerable 上多次调用 ToList() 的代码,它应该只执行一次并保存到变量中。
有一个简单的经验法则。如果您将 IEnumerable 列表作为一个整体(Linq 表达式)进行操作或只是从头到尾浏览列表,则使用 IEnumerable,如果您需要按索引访问列表,或计算元素数量或通过list,先创建一个List容器并使用。
IE。
List<Friend> friends = FindFriends().ToList();
//Then use the friends list....
现在,关于您的列表中是否有任何内容,正如这里的一些人所提到的,您可以使用数据绑定(bind)和像 ItemsControl 这样的控件,但是如果您确实想动态地构建 UI 内容,请不要使用循环' 不索引到数组中。
List<Friend> friends = FindFriends().ToList();
if(friends.Count > 0)
{
foreach(Friend f in friends)
{
//Create your Control(s) and add them to your form or panel's controls container
// somthing like (untested) myPanel.Controls.Add(new Label(){Text = f.Name});
}
}
关于c# - 我想检查 IEnumerable 的计数,但效率很低,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3191766/