使用LINQ从嵌套集合中选择Single

时间:2012-06-27 00:56:20

标签: 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 omitted for brevity
}

public class BaseClassContainer : INotifyPropertyChanged
{
    private ObservableCollection<MyBaseClass> baseClasses;
    public ObservableCollection<MyBaseClass> BaseClasses
    {
    //...Omitted for brevity...
    }
}

然后在我的代码中,我有一个类型为BaseClassContainer的ObservableCollection( BaseClassContainerCollection )。我想弄清楚的是我如何使用LINQ从ObservableCollection中选择一个BaseClassContainer,其中一个MyBaseClass.ID匹配特定的Guid。我使用Single()方法的原因是因为我知道它们都是独一无二的。

我尝试了以下但是不起作用:

var result = BaseClassContainerCollection.Single(container => container.BaseClasses.Single(baseClass => baseClass.ID == specificGuid));

我收到错误消息:无法将类型'MyBaseClass'隐式转换为'bool'。我错过了什么?

1 个答案:

答案 0 :(得分:3)

让我们分开您的查询:

BaseClassContainerCollection.Single(yourPredicate);

Single,因为它在这里使用,基本上说“过滤这个谓词上的BaseClassContainerCollection”(一个“过滤器”函数,对于是否在结果中包含它,计算结果为true或false)。而不是返回true / false的函数,而是说你想要它来评估MyBaseClass,这是没有意义的。你对Single的内部调用是有道理的,因为x => x.Id == guid是一个返回true / false的函数,只过滤那些满足条件的元素(然后声明你知道只有其中一个元素在结果或者抛出异常)。

你要做的是Select来自内部查询的单个MyBaseClass结果,然后在结果上调用Single(没有谓词),因为你知道结果应该只返回一个项目。我相信你在寻找:

BaseClassContainerCollection.Select(container => container.BaseClasses.Single(baseClass => baseClass.ID == specificGuid)).Single();