【问题标题】:Can I use linq to remove items from asp .net DropDownList.Items?我可以使用 linq 从 asp .net DropDownList.Items 中删除项目吗?
【发布时间】:2012-07-23 23:43:37
【问题描述】:

正如标题所说,是否可以使用 LINQ 从 DropDownList 的 .Items 中删除 Item 不等于我指定的字符串的项目?

换句话说 - 我有一个字符串列表,如果一个项目与列表中的任何字符串都不匹配,它就会被删除。

注意:我知道如何实现这一点,我可以使用 foreach 循环来实现。没关系 - 但我想知道是否有 LINQ 替代方案。

编辑:我应该说 - Item 的 .Text 属性匹配字符串列表中的任何项目。

编辑:对于那些感兴趣的人,这是我提出的“foreach”方式:

        private void FilterDropDownChoices(List<String> permittedChoices)
        {
            foreach(ListItem item in ddlChoices.Items)
            {
                if (!permittedChoices.Contains(item.Text))
                {
                    ddlChoices.Items.Remove(item);
                }
            }
        }

【问题讨论】:

  • 你测试过吗?您实际上应该收到该代码的错误,因为您在迭代时无法更改集合。
  • 我没有测试过它,当我在等待这个 linq 替代品时,它很快就被三心二意地拼凑在一起了。鉴于您刚刚提到的错误 - 如果没有建议的 LINQ 替代方案,我将获取并设置 foreach 之外的项目集合(使用另一个本地集合)。谢谢@ryanulit。
  • 这里有一个foreach 循环,用于产生副作用(改变Items 集合)。 Linq 不能替代它。 Linq 用于查询,这不是您正在做的。 Further reading。您能做的最好的事情是通过 LINQ 获取要删除的项目集。不过,您仍然希望有一个 foreach 循环来实际删除它们。
  • 好奇:你为什么要使用 LINQ?

标签: c# asp.net linq dropdownbox


【解决方案1】:

ryanulit 实际上提供了最好的答案。

问题在于 ListItemCollection 只实现了 IEnumerable 接口。 LINQ 扩展适用于 IEnumerable。因此,将 (IEnumerable) 转换为 (IEnumerable) - 您现在可以使用 LINQ。

所以,回答你的问题:

ddlChoices.Items
.Cast<ListItem>()
.Where(item => !permittedChoices.Contains(item.Text))
.ToList()
.ForEach(ddlChoices.Items.Remove);

您必须使用 ToList() 或 ToArray() 或类似方法,因为在读取集合时无法修改集合 - ToList() 复制对选定项目的引用,然后可以循环并从 ListItemCollection 中删除.

在写这篇文章时,我看到了 Matten 的评论 - 他强调了 ListItemCollection 的有用功能(能够通过它们的文本属性删除项目)但问题是错误的。要求是:您只允许在 ddlChoices.Items 中拥有“permittedChoices”。 Matten 的示例删除了有效的选择并留下了与他所要求的相反的无效选择。

【讨论】:

    【解决方案2】:

    LINQ 是一种查询语言,它不用于修改您的数据。 您可以做什么,它会根据您喜欢的条件查询您的项目列表,然后自行影响收集。

    样本:

    var relevant = from item in list.Items
                   where permittedChoices.Contains(item.ToString())
                   select item
    

    然后您可以清除项目列表并仅添加您想要的相关内容。

    ddlChoices.Clear();
    ddlChoices.AddRange(relevant.ToArray());
    

    【讨论】:

      【解决方案3】:

      只是为了使用 linq?给你:-)

      private static void FilterDropDownChoices(List<String> permittedChoices)
      {
          ddlChoices.Items.Cast<ListItem>()
             .Where(li => permittedChoices.Contains(li.Text))
             .ToList()
             .ForEach(ddlChoices.Items.Remove);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-17
        • 2022-10-25
        • 1970-01-01
        • 2020-01-04
        • 2018-03-27
        • 1970-01-01
        • 2023-02-12
        • 1970-01-01
        相关资源
        最近更新 更多