2012-06-25 90 views
4

使用DefaultIfEmpty我有這個類:如何在嵌套查詢

class OriginalClass { 
    string FirstItem; 
    List<string> ListOfSecondItems; 
} 

我想一個類的列表轉換成另一個列表,或爲「扁平化」這一類成新:

class FlattenedClass { 
    string First; 
    string Second; 
} 

我使用這個LINQ表達式從一個轉換到另一個:

OriginalClass original; 
var flattened = from Item in original 
    from secondItem in item.ListOfSecondItems 
    select new FlattenedClass(item.FirstItem, secondItem); 

的問題是,如果名單第二項是空的我失去了第一項。我想有一些「(默認)」值要使用如果列表爲空或空。我猜DefaultIfEmpty是關鍵,但不知道如何將它整合到現有的查詢。

回答

3

這次調用DefaultIfEmpty說:「如果ListOfSecondItems是空的,用一個單一的空來代替。」

var flattened = 
    from Item in original 
    from secondItem in item.ListOfSecondItems.DefaultIfEmpty() 
    select new FlattenedClass(item.FirstItem, secondItem); 

你的問題中提到的可能性,ListOfSecondItems可能爲空。這段代碼處理這種可能性。它還提供一個默認的字符串,而不是空(使用DefaultIfEmpty的其他版本)。

var flattened = 
    from Item in original 
    let subList = item.ListOfSecondItems ?? new List<string>() 
    from secondItem in subList.DefaultIfEmpty("(default)") 
    select new FlattenedClass(item.FirstItem, secondItem); 
+0

讓我現在想知道,我怎麼會錯過它:) – Dialecticus