我有一个名为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
个?
答案 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();