2

選擇單我有兩個類 - MyBaseClassBaseClassContainer - 這是宣佈類似這樣的:使用LINQ從嵌套集合

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」到「布爾」。我錯過了什麼?

回答

3

讓掰開查詢:

BaseClassContainerCollection.Single(yourPredicate); 

Single,因爲它用在這裏,基本上說「這個謂詞過濾BaseClassContainerCollection」(一個「過濾器」功能,計算結果爲真或假與否將其包含在結果中)。而不是一個返回true/false的函數,你說你想讓它評估一個MyBaseClass,這是沒有道理的。你對Single的內在呼籲是有道理的,因爲x => x.Id == guid是一個函數,它返回true/false並且只過濾符合條件的元素(然後聲明你知道結果中只有一個元素,否則拋出異常) 。

你想要做什麼是Select單MyBaseClass導致內部查詢,然後調用單上的結果(無謂語),因爲你知道結果應該只有一個項目回來。我相信你正在尋找:

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

我認爲這正是我所期待的。現在我只需要弄清楚爲什麼它告訴我該序列不包含匹配的元素。我在該特定行上放置了一個斷點,並觀察它找到了與特定Guid匹配的MyBaseClass,但它仍然告訴我沒有匹配。我認爲這可能是一個有約束力的問題。但現在,將其標記爲答案。 – dgsmith15