2

我有两个类 - MyBaseClassBaseClassContainer - 声明如下:

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 ( BaseClassContainerCollection ) 类型的 ObservableCollection。我想弄清楚的是如何使用 LINQ 从 ObservableCollection 中选择一个 BaseClassContainer,其中一个 MyBaseClass.ID 与特定的 Guid 匹配。我使用 Single() 方法的原因是因为我知道它们都是独一无二的。

我尝试了以下方法,但它不起作用:

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

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

4

1 回答 1

3

让我们分解您的查询:

BaseClassContainerCollection.Single(yourPredicate);

Single,就像这里使用的那样,基本上是说“在这个谓词上过滤 BaseClassContainerCollection”(一个“过滤器”函数,用于判断是否将其包含在结果中)。您不是说返回 true/false 的函数,而是说您希望它评估为 MyBaseClass,这没有意义。您的内部调用Single是有道理的,因为x => x.Id == guid它是一个返回真/假的函数,并且仅过滤那些符合条件的元素(然后声明您知道结果中只会有其中一个元素,否则会引发异常)。

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

BaseClassContainerCollection.Select(container => container.BaseClasses.Single(baseClass => baseClass.ID == specificGuid)).Single();
于 2012-06-27T01:10:24.533 回答