【问题标题】:Filtering ICollection过滤 ICollection
【发布时间】:2013-11-22 23:30:17
【问题描述】:

此代码不起作用,但是:

public virtual ICollection<SomeItem> items { get { return (ICollection<SomeItem>)items.Where(e => e.isVisible == true); } set { ;} }

我想为此做点什么。因此,要获取由集合元素的属性过滤的 ICollection。

当然,我可以遍历元素,并获得正确的元素,将它们放入新集合并返回,但有更好的解决方案吗?

【问题讨论】:

  • 你得到什么错误信息?
  • 为什么它不起作用? items 是什么?
  • 你想使用一个属性本身?这会给你著名的StackOverFlow 例外。
  • 返回IEnumerable&lt;SomeItem&gt;。实现ICollection&lt;SomeItem&gt; 的最简单方法是调用ToList(),它返回一个List&lt;SomeItem&gt;,它实现了ICollection&lt;SomeItem&gt;(以及一些其他接口)
  • 您是否使用 System.Linq 添加;在源文件的顶部?

标签: c# icollection


【解决方案1】:

也许您正在寻找的是Extension Method

扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。

public static class ExtensionMethods
{
    public static ICollection<SomeItem> OnlyVisible(this ICollection<SomeItem) items) {
        return items.Where(e => e.isVisible).ToList();
    }
}

请注意,Where 返回一个您无法修改的IEnumerable,因此我调用ToList(),它基本上完成了您最后一句中的所有操作。

然后你会像这样使用它:

void Foo(ICollection<SomeItem> items) {

    foreach (var i in items.OnlyVisible()) {
        // Use i
    }
}

【讨论】:

    【解决方案2】:

    试试:

    items.Where(e => e.isVisible == true).ToList()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-11
      • 1970-01-01
      • 2010-12-05
      • 2010-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多