使用LINQ从嵌套集合中选择单个集合
我有两个类-MyBaseClass和BaseClassContainer,声明如下:使用LINQ从嵌套集合中选择单个集合,linq,collections,nested,linq-to-objects,observablecollection,Linq,Collections,Nested,Linq To Objects,Observablecollection,我有两个类-MyBaseClass和BaseClassContainer,声明如下: public class MyBaseClass { private Guid id; public Guid ID { if (id == Guid.Empty) { id = Guid.NewGuid(); } return id; } //...Other Properties
public class MyBaseClass
{
private Guid id;
public Guid ID
{
if (id == Guid.Empty)
{
id = Guid.NewGuid();
}
return id;
}
//...Other Properties omitted for brevity
}
及
我得到一个错误:无法隐式地将类型“MyBaseClass”转换为“bool”。我遗漏了什么?让我们来分析一下你的问题:
BaseClassContainerCollection.Single(yourPredicate);
这里使用的Single
,基本上表示“filter BaseClasseContainerCollection on this谓词”(一个“filter”函数,其计算结果为true或false,以确定是否将其包含在结果中)。不是返回true/false的函数,而是希望它计算为MyBaseClass,这是没有意义的。您对Single
的内部调用是有意义的,因为x=>x.Id==guid
是一个函数,它只返回true/false并筛选满足条件的元素(然后声明您知道结果中只有一个元素,否则会引发异常)
您要做的是从内部查询中选择单个MyBaseClass结果,然后对结果调用single(不带谓词),因为您知道结果应该只返回一个项。我相信您正在寻找:
BaseClassContainerCollection.Select(container => container.BaseClasses.Single(baseClass => baseClass.ID == specificGuid)).Single();
我想这正是我想要的。现在我要弄清楚为什么序列中没有匹配的元素。我在那一行上放置了一个断点,观察到它找到了ID与特定Guid匹配的MyBaseClass,但它仍然告诉我没有匹配项。我认为这可能是一个有约束力的问题。然而,就目前而言,这是答案。
BaseClassContainerCollection.Single(yourPredicate);
BaseClassContainerCollection.Select(container => container.BaseClasses.Single(baseClass => baseClass.ID == specificGuid)).Single();