gpt4 book ai didi

c# - 对象收集位置的 Linq 结果

转载 作者:太空狗 更新时间:2023-10-30 00:07:33 26 4
gpt4 key购买 nike

我遇到了一个我可以解决的问题,但我觉得 Linq 中应该有一个我只是没有看到的解决方案。

所以我有两个类,一个详细记录类和这些类的集合:

public class ItemDetail
{
public string Name {get;set;}
public int? Id {get;set;}
}

public class ItemDetailCollection : List<ItemDetail>
{
}

现在,我可以毫无问题地使用我的存储库层填充这些对象,并查询数据以获得我想要的记录子集。

var items = Repository.GetItemCollection();
var reportItemCollection = items.Where(x=>x.Id.HasValue);

这一切都很好,花花公子。然而,reportItemCollection是一个 IEnumberable<ItemDetail> ,而我真正想要的是一个新的 ItemDetailCollection .

当然,我可以创建一个新的集合并添加查询范围,但我觉得有一种方法可以自动将结果集填充为特定的集合类型。我尝试添加以下内容,但只收到 NULL 的结果:

var reportItemCollection = items.Where(x=>x.Id.HasValue) as ItemDetailCollection;

并尝试 .Cast<ItemDetailCollection>()也不起作用。终于,我试过了

var reportItemCollection = items.Where(x=>x.Id.HasValue).Select(result => new ItemDetailCollection(){ result });

但这只会给我一个 IEnumerable<ItemDetailCollection> .

有什么想法吗?

最佳答案

唯一的方法是实际构造集合,使用 List<T> 的构造函数:

public class ItemDetailCollection : List<ItemDetail>
{
public ItemDetailCollection(IEnumerable<ItemDetail> items)
: base(items) { }
}

var reportItemCollection = new ItemDetailCollection(
items.Where(x=>x.Id.HasValue)
);

你不能转换 IEnumerable<T>到像 ItemDetailCollection 这样的子类,由于协变/逆变的规则(参见此处,例如:http://blogs.msdn.com/b/csharpfaq/archive/2010/02/16/covariance-and-contravariance-faq.aspx)。

关于c# - 对象收集位置的 Linq 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21636504/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com