【问题标题】:Use LINQ to select Single from nested collections使用 LINQ 从嵌套集合中选择 Single
【发布时间】:2012-06-27 00:56:19
【问题描述】:

我有两个类 - 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”。我错过了什么?

【问题讨论】:

    标签: linq collections nested linq-to-objects observablecollection


    【解决方案1】:

    让我们分解您的查询:

    BaseClassContainerCollection.Single(yourPredicate);
    

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

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

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

    【讨论】:

    • 我认为这正是我想要的。现在我要弄清楚为什么它告诉我序列不包含匹配元素。我在该特定行上放了一个断点,并观察它找到了 ID 与特定 Guid 匹配的 MyBaseClass,但它仍然告诉我不匹配。我认为这可能是一个有约束力的问题。但是,现在,将其标记为答案。
    猜你喜欢
    • 2021-05-25
    • 2018-06-23
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    相关资源
    最近更新 更多