如何仅从列表中选择某些属性设置为true的项目

时间:2014-05-14 12:59:22

标签: c# linq

我有一个名为ItemCollection的集合,如下所示:

public class ItemCollection : List<Item>
{
}

Item有一个名为MyProperty的属性:

public class Item
{
    public bool MyProperty { get; set; }
}

我还有一个ItemManager,其GetItems方法返回ItemCollection

现在我只希望从ItemCollection获取MyProperty设置为true的项目。

我试过了:

ItemCollection ic = ItemManager.GetItems().Where(i => i.MyProperty);

不幸的是Where部分不起作用。虽然i引用Item,但我收到了错误

  

无法将类型Item隐式转换为ItemCollection。

如何过滤返回的ItemCollection以仅包含Item设置为true的MyProperty个?

2 个答案:

答案 0 :(得分:1)

部分答案/评论已提及

(ItemCollection)ItemManager.GetItems().Where(i => i.MyProperty).ToList()

由于向上播放而无效。相反,上面将生成List<Item>

以下是您需要完成这些工作的内容。请注意,您需要能够修改ItemCollection类才能使其正常工作。


构造

如果您想为ItemCollection类创建构造函数,那么以下内容应该有效:

public ItemCollection(IEnumerable<Item> items) : base(items) {}

要调用构造函数,您将执行以下操作:

var ic = new ItemCollection(ItemManager.GetItems().Where(i => i.MyProperty));

ItemCollection ic = new ItemCollection(ItemManager.GetItems().Where(i => i.MyProperty));


请注意错误消息

在评论中,当系统要求您将ItemCollection ic = ItemManager.GetItems.....更改为var ic = ItemManager.GetItems.....然后告诉我们ic的类型时,您提到您Systems.Collections.Generic.List<T>会翻译List<Item>Cannot implicitly convert type IEnumerable<Item> to ItemCollection. 。您收到的错误消息实际上不是您应该收到的错误消息,这可能只是由于IDE混淆,有时会在页面上出现错误时发生。你应该得到的是更多的东西:

{{1}}

答案 1 :(得分:0)

扩展功能也是 Great 解决方案:

public static class Dummy { 
    public static ItemCollection ToItemCollection(this IEnumerable<Item> Items)
    {
        var ic = new ItemCollection();
        ic.AddRange(Items);
        return ic;
    }
}

所以你得到的结果是:

ItemCollection ic = ItemManager.GetItems().Where(i => i.MyProperty).ToItemCollection();