2013-01-28 26 views
5

बहुत सही शब्दों में शायद नहीं किया जा, लेकिन यहाँ मैं क्या है और यहां परिणाम मैं हासिल करना चाहते है:Linq का उपयोग करना, लक्ष्य वस्तु के भीतर एक सूची में वस्तुओं के खिलाफ GroupBy के लिए कैसे

class Cake 
{ 
public List<string> Ingrediants {get;set;} 
public DateTime Baked {get;set;} 
public string CakeName {get;set;} 
} 

List<Cake> cakes= new List<Cake>(); 
cakes.Add(new Cake() {CakeName = "Cake1", Ingrediants = new List<string>() {"Sugar", "Chocolate"}}); 
cakes.Add(new Cake() {CakeName = "Cake2", Ingrediants = new List<string>() {"Sugar", "Butter"}}); 
cakes.Add(new Cake() {CakeName = "Cake3", Ingrediants = new List<string>() {"Stevia", "Butter"}}); 

मैं समूह चाहते हैं ingrediant केक केक। तो मैं इसके साथ समाप्त करना चाहता हूं:

- Sugar 
     Cake1 
     Cake2 
- Stevia 
     Cake3 
- Chocolate 
     Cake1 
- Butter 
     Cake2 
     Cake3 

अग्रिम धन्यवाद!

+0

आप क्या चाहते हैं, GroupBy या OrderBy? यह भी स्पष्ट नहीं है कि केक का आदेश कैसे दिया जाता है। –

+0

मैं ग्रुपबी का उपयोग करके उन्हें समूहित करना चाहता हूं। केक आदेश महत्वपूर्ण नहीं है – Tom

उत्तर

8

आप क्वेरी comprehensions कोई आपत्ति नहीं है, यहाँ एक विकल्प (कृपया ध्यान को सही वर्तनी) है! यह एक वैध सवाल है! भाषा-कल्पना समूह-दर के साथ समझने की अनुमति देता है। IGrouping<string,Cake> तकनीकी रूप से IEnumerable<Cake> है जिसमें Key प्रकार string की संपत्ति है - इस मामले में घटक। कंपाइलर इसे अन्य उत्तरों के लगभग समान कोड में बदलने के लिए काम करता है।

हम क्वेरी को बदलने एक into और एक select खंड है कि बंद से काम करता है क्वेरी-निरंतरता शुरू करने से अन्य उत्तर के समान ही सामान्य प्रकार उत्पन्न करने के लिए कर सकते हैं:

var query = 
    from cake in cakes 
    from ingredient in cake.Ingredients 
    group cake by ingredient into cakesGrouped 
    select new { Ingredient = cakesGrouped.Key, 
     Cakes = cakesGrouped.ToList() }; 

दोनों धाराप्रवाह-वाक्य रचना और query- सिंटैक्स जानने के लायक हैं, आईएमएचओ। चीयर्स!

+2

+1 अच्छा, क्वेरी सिंटैक्स इस मामले में अधिक पठनीय है। – GolfWolf

4

यहाँ एक तरीका यह करना है:

var result = cakes 
    .SelectMany(c => c.Ingrediants.Select(i => new 
     { 
      c.CakeName, 
      Ingredient = i 
     })) 
    .GroupBy(x => x.Ingredient) 
    .Select(g => new 
     { 
      Ingredient = g.Key, 
      Cakes = g.Select(x=>x.CakeName).ToArray() 
     }); 

result एक गुमनाम प्रकार का एक IEnumerable हो जाएगा; एक तत्व एक घटक और सभी केक का प्रतिनिधित्व करता है जिसमें यह शामिल है।

+0

इनपुट के लिए धन्यवाद। मैं इसे सही के रूप में चिह्नित करूंगा लेकिन ली ने आपको एक मिनट या 2 से हराया। – Tom

+1

@ टॉम एफडब्ल्यूआईडब्ल्यू, यह सच नहीं है। जब आप LINQ का उपयोग करके सबसे शुरुआती उत्तर खोजना चाहते हैं तो आपको 'answer.in (a => a.Time)' करना चाहिए, 'अधिकतम' :-) – GolfWolf

6
var ingrediants = cakes.SelectMany(c => c.Ingrediants.Select(i => new { Cake = c, Ingrediant = i })) 
    .GroupBy(ci => ci.Ingrediant) 

तब समूह कुंजी घटक नाम है और समूह संग्रह मिलान केक है।

IEnumerable<IGrouping<string,Cake>> query = 
    from cake in cakes 
    from ingredient in cake.Ingredients 
    group cake by ingredient; 

आश्चर्य: