C# 我想检查IEnumerable的计数,但它';它效率很低
特别感谢Rex M: 所以这个问题有两个部分:C# 我想检查IEnumerable的计数,但它';它效率很低,c#,.net,linq,ienumerable,C#,.net,Linq,Ienumerable,特别感谢Rex M: 所以这个问题有两个部分: 您建议我如何处理用户可能拥有的不同数量的朋友。使用我的当前代码,如果用户没有朋友,我会收到IndexOutOfBounds异常,因为friendsList[0]不存在 如何更有效地处理用户是否有朋友的验证?调用.ToList()似乎很累人 1) 将好友列表数据绑定到列表框。可以使用数据模板显示图像和标签 2) 调用Any()在这种情况下,只需在if语句之前调用ToList()一次,而不是每次都创建一个列表 编辑 您可能希望查看MVVM模式,并使用X
列表框
。可以使用数据模板显示图像和标签
2) 调用
Any()
在这种情况下,只需在if语句之前调用ToList()
一次,而不是每次都创建一个列表
编辑
您可能希望查看MVVM模式,并使用XAML将控件绑定到数据使用某种ItemContainer控件,例如any。您只需为项目的外观指定一个模板,并设置其
ItemsSource
属性:
myItemsControl.ItemsSource = new ObservableCollection(myFriends.Take(4));
这将显示最多4个好友,根据需要多次重复模板,但如果集合为空,则重复次数最多为0。在IEnumerable上调用ToList()时,您要做的是枚举可枚举列表的所有元素,并将结果放入容器中。所以“代码气味”是在同一个IEnumerable上多次调用ToList()的代码,应该只执行一次并保存到变量中
有一个简单的经验法则。如果要对整个IEnumerable列表(Linq表达式)进行操作,或者只是从开始到结束导航列表,那么请使用IEnumerable;如果需要按索引访问列表,或者需要计算元素数,或者在列表中双向导航,请先创建一个列表容器并使用它
i、 e
List friends=FindFriends().ToList();
//然后使用好友列表。。。。
现在,关于列表中是否有任何内容,正如这里的一些人所提到的,您可以使用数据绑定和类似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});
}
}
List friends=FindFriends().ToList();
如果(friends.Count>0)
{
foreach(朋友中的朋友f)
{
//创建控件并将其添加到窗体或面板的控件容器中
//类似于(未测试的)myPanel.Controls.Add(新标签(){Text=f.Name});
}
}
这是一个很好的局部优化。但是,甚至不需要转换为列表,因为OP已经有了一个IEnumerable
,可以使用foreach
进行迭代。尽管从外观上看,他已经静态创建了friend1,friend2等,这可能会使使用foreach变得困难,因为必须对您正在查看的索引进行附加条件检查。我的第一个建议是将更改量保留在一个简单的重构中
myItemsControl.ItemsSource = new ObservableCollection(myFriends.Take(4));
List<Friend> friends = FindFriends().ToList();
//Then use the friends list....
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});
}
}