【问题标题】:MenuItemCollection vs. List<MenuItem>MenuItemCollection 与 List<MenuItem>
【发布时间】:2011-03-05 13:19:09
【问题描述】:

最近我用 Lambda 表达式写了一段 C# 代码:

var dynMenu = new List<MenuItem>();
// some code to add menu items to dynMenu
if (!dynMenu.Any(x => x.Text == controller))
{ 
    // do something
}

在浏览我的代码时,我发现每个 MenuItem 本身都有一个名为 ChildItems 的属性,该属性恰好是 MenuItemCollection 类型。很感兴趣,我想我会用这个 MenuItemCollection 替换我的 MenuItem 列表。

将第一行改为:

var dynMenu = new MenuItemCollection();

我注意到这个 MenuItemCollection 类型没有“Any”、“All”、“First”等扩展方法——我觉得这很奇怪。

有没有办法在这里使用 Lambda 表达式?

我应该回到使用“列表”吗?

【问题讨论】:

  • 使用 OfType() 扩展方法的 AsQueryable 扩展方法,它会让您访问所有 linq 优点。
  • @Darren,应该回答这个问题。
  • 你的意思是这样吗? dynMenu.AsQueryable().OfType().Any(x => x.Text == "something");
  • 这里使用 Cast 比 OfType 更合适。 OfType 实际上过滤了集合 - 在这种情况下,您提前知道每个元素的类型都是相同的,因此 Cast 更好。

标签: c# lambda extension-methods menuitem


【解决方案1】:

MenuItemCollection 是一个 .NET 1.1 类。它没有实现任何通用集合接口,尤其是IEnumerable&lt;MenuItem&gt;

由于这仅实现 IEnumerable 而不是 IEnumerable&lt;MenuItem&gt;,因此 LINQ 提供的所有需要​​它的扩展方法都不起作用。但是,您可以通过以下方式找回它们:

if (dynMenu.Cast<MenuItem>().Any(x => x.Test == controller)) { // ...

Cast 扩展方法将IEnumerable 转换为IEnumerable&lt;T&gt;,提供对其他 LINQ 扩展方法的访问。

【讨论】:

  • 哈哈。我没有意识到那是 .NET 1.1——所以我不应该使用它吗?我基本上是在尝试在 ASP.NET MVC 中构建一个动态构造的多嵌套导航栏,它似乎是一个合理的使用结构。 (而不是发明我自己的......)
  • @Pretzel:这取决于 - 我可能只使用 List 代替。但是,如果您最终必须创建一个 MenuItemCollection,有时直接使用它会更容易(虽然很少见)。
  • 嗯...好的。我会考虑一下。感谢您的建议和 IEnumerable / Type 课程!
【解决方案2】:

MenuItemCollection 是一个专门的集合,并没有实现 IEnumerable 接口来使用您在上面提到的 Linq 扩展方法。我会回到通用列表,因为它具有更多功能

【讨论】:

  • 它确实实现了 IEnumerable,只是没有实现 IEnumerable
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-01
  • 1970-01-01
  • 2018-02-14
  • 1970-01-01
  • 2011-07-28
  • 2020-05-11
相关资源
最近更新 更多