【问题标题】:Is there a simpler way to preform projection on a ListItemCollection?有没有更简单的方法在 ListItemCollection 上进行投影?
【发布时间】:2013-02-14 23:32:13
【问题描述】:

万事如意, 有没有办法对列表框的内容进行投影。 具体来说,我希望能够做到这一点,而不必清除并重新添加我的列表框的内容 这是我目前拥有的。

public static void SetSelectedWhere(this ListBox listbox, Func<ListItem,bool> condition) 
{
   var queryableList = listbox.Items.Cast<ListItem>();
   queryableList.Select(x=>condition(x)?x.Selected:x.Selected=false);
   listbox.Items.Clear();
   listbox.Items.AddRange(queryableList.ToArray<ListItem>());
}

必须清除我现有的收藏并重新添加内容似乎很愚蠢。

任何想法

【问题讨论】:

    标签: c# linq optimization webforms projection


    【解决方案1】:

    普通的旧迭代呢?

    foreach (ListItem item in listbox.Items)
    {
        item.Selected = condition(item);
    }
    

    LINQ 不是生命宇宙和一切的答案。尤其是涉及在现有对象上设置属性的宇宙部分。

    【讨论】:

    • 我会说这取决于,LINQ 让我快乐,这似乎至少是对生活的一个很好的回答 ;-)
    • @AdamHouldsworth:我的说法是“LINQ 让我觉得自己是忍者”;-)
    • 您的代码无法编译,因为.Items 返回一个对象枚举——不是强类型的ListItem
    • @Joshua:我们不是在说thisListBox吗?
    • 好儿子... *看到asp.net-webforms标签*。是的,是的,我们是。别管我~~
    【解决方案2】:
    listbox.Items
          .Cast<ListItem>()
               .Where(x=> condition(x))
                    .ToList()
                          .ForEach(item => item.Selected = true);
    

    List&lt;T&gt; 有一个名为ForEach 的方法,您可以对列表中的任何项目执行操作:

    【讨论】:

      【解决方案3】:

      删除和读取集合中的项目是愚蠢的,因为它完全没有必要。

      您应该能够将其简化为以下内容:

      foreach (ListItem item in listbox.Items)) {
        item.Selected = condition(item);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-25
        • 1970-01-01
        • 2023-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多