2012-11-30 67 views
2
public class Vehicle { 
    public string Type 
    public List<Color> Colors; 
} 

public class Result { 
    public string Type 
    public string Color; 
} 

我從一個查詢,看起來像這樣得到的Result的列表不同父:選擇具有多個孩子

Car -> Red 
Car -> Blue 
Boat -> Brown 
Boat -> Yellow 
Boat -> Green 
Plane -> White 

我想選擇這個名單向具備LINQ一個List<Vehicle>。我試過,但它沒有工作:

var List<Vehicle> = results.Select(v => new Vehicle 
    { 
    Type = v.Type; 
    Colors = new List<Color> { new Color = v.Color } 
    } 

我確信我需要在這裏使用某種組,但我不知道如何。

回答

3

聽起來應該通過GroupBy電話去:

var query = input.GroupBy(x => x.Type, x => x.Color) 
       .Select(g => new Vehicle { Type = g.Key, Colors = g.ToList() }) 
       .ToList(); 

注意,還有的GroupBy另一個重載這樣可以讓你跳過Select電話,但我認爲這是簡單的做這個辦法。讓我知道你是否想要替代形式。

需要注意的是,如果你真的不需要這些在Vehicle對象,你可以只使用一個Lookup

var lookup = input.ToLookup(x => x.Type, x => x.Color); 

foreach (var color in lookup["Car"]) 
{ 
    // ... 
} 

這是方便,如果你只需要你要查詢其具體的方法中的結果,但如果你在其他地方傳播數據,創建一個List<Vehicle>會更有意義。

+0

謝謝!第一個效果最好。 – Niklas

0
results.GroupBy(r => r.Type) 
     .Select(g => new Vehicle { 
            Type = g.Key, 
            Colors = t.Select(p => p.Color).ToList() 
           }) 
     .ToList() 
+0

這是按* color *分組的,組中的每個元素都是完整的結果。我想你想要的東西更像我的回答。 –

+0

沒錯,那是可行的 - 雖然我覺得如果你把每個分組只是一組顏色,那就更簡單了。我還*強烈*建議使用換行符和空格來增加可讀性:) –

+0

我編輯了帖子,我同意由兩個字段組成的字母較少,但不會更改,因爲這是我的初始答案 –