C# 我想检查IEnumerable的计数,但它';它效率很低

C# 我想检查IEnumerable的计数,但它';它效率很低,c#,.net,linq,ienumerable,C#,.net,Linq,Ienumerable,特别感谢Rex M: 所以这个问题有两个部分: 您建议我如何处理用户可能拥有的不同数量的朋友。使用我的当前代码,如果用户没有朋友,我会收到IndexOutOfBounds异常,因为friendsList[0]不存在 如何更有效地处理用户是否有朋友的验证?调用.ToList()似乎很累人 1) 将好友列表数据绑定到列表框。可以使用数据模板显示图像和标签 2) 调用Any()在这种情况下,只需在if语句之前调用ToList()一次,而不是每次都创建一个列表 编辑 您可能希望查看MVVM模式,并使用X

特别感谢Rex M:

所以这个问题有两个部分:

  • 您建议我如何处理用户可能拥有的不同数量的朋友。使用我的当前代码,如果用户没有朋友,我会收到IndexOutOfBounds异常,因为friendsList[0]不存在

  • 如何更有效地处理用户是否有朋友的验证?调用.ToList()似乎很累人

  • 1) 将好友列表数据绑定到
    列表框
    。可以使用数据模板显示图像和标签


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