2009-04-06 16 views
8

मैं बहुत की तरह डेटा की एक सूची है:सपाट Linq समूह क्वेरी

ID AddressPurpose Address ... 
1 L 
1 P 
2 L 
2 P 
3 P 
3 L 
4 P 
4 L 
5 P 
6 L 

मैं डेटा को फ़िल्टर करने में सक्षम होना चाहते हैं, जिससे कि एक पी पंक्ति तो यह किसी और दिया जाता है वहाँ है यदि प्रत्येक अद्वितीय संख्या के लिए एल पंक्ति वापस आ गई है। तो डेटा इस तरह दिखेगा:

ID AddressPurpose Address ... 
1 P 
2 P 
3 P 
4 P 
5 P 
6 L 

फिलहाल मैं इस क्वेरी जो ठीक काम करता है है:

var query = from c in list 
      orderby c.AddressPurpose descending 
      group c by c.ID 
      into g 
       select g; 

var finalList = new List<Company>(); 
foreach (var list in query) 
{ 
    finalList.Add(list.First()); 
} 
return finalList; 

वहाँ अतिरिक्त foreach का उपयोग किए बिना यह करने के लिए एक बेहतर तरीका है?

var query = 
    from i in (
     from c in list 
     orderby c.AddressPurpose descending 
     group c by c.ID into g 
     select g) 
    select i.First(); 

return query; 

मुझे यकीन है कि यह यह (या संभावित रूप से सबसे अच्छा) करने के लिए एकमात्र तरीका नहीं है, लेकिन यह अपने "foreach" लपेट करता है:

उत्तर

3

आप selectg.First() क्यों नहीं हैं?

+0

आपको यह लिखना होगा कि मैं अपना खुद का श्वास संपादित कर रहा हूं, एलसी! +1! –

+0

मुझे ऐसा लगता है। मुझे आपके घोंसले के प्रश्न भी पसंद हैं, जब भी आपको जटिल प्रश्नों के माध्यम से पुन: प्रयास करने की आवश्यकता होती है, वे पुन: प्रयोज्य होते हैं। –

+0

धन्यवाद। यह बहुत अच्छा काम करता है। मैं अब "जी में" भाग को समझता हूं। –

10

तुम हमेशा घोंसला आपके प्रश्नों सकता है एक प्रश्न में।

var query = from c in list 
      orderby c.AddressPurpose descending 
      group c by c.ID into g 
      select g.First(); 

सही परिणाम दे रहा है यही कारण है कि:

संपादित

वास्तव में, आप इस के लिए नीचे को आसान बनाने में कर सकते हैं।

2
var finalList = list 
    .GroupBy(c => c.ID) 
    .Select(g => g.OrderByDescending(c => c.AddressPurpose).First()) 
    .ToList();