我有两个类 - 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'。我错过了什么?
答案 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();